1 条题解

  • 2
    @ 2025-10-22 12:06:47

    本题改编至 [CSP-J] 2024 T3,如果你 AC 了此题,赶紧 AC 了 [CSP-J] 2024 T3

    错误想法(必看)

    首先,拿到这个题,你肯定想:这也太简单了,计算出 amina_{min} ,让后在疯狂输出这个数,直到没有油漆,对吧!如果你这么想,恭喜你,你就拿到 00 分(因为数据一点都不水),让后你会发现你成功的 WA 了。为什么会 WA?因为我可以出一个样例来告诉你,你是错的:

    5
    2 3 9 9 9 9 9 9 9
    

    你运行后会输出 1111,但答案是 2121,因为写出 2121 只需用 a1+a2=5a_1 + a_2 = 5升油漆,刚好够。怎么样,你服不服。

    正解

    本题可以考虑贪心。 首先,我们数位越多,数字就越大,所以我们可以计算出最多有多少位,怎么算? 当然是

    n/aminn/a_{min}

    很明显吧! 然后从高到低一位一位的枚举,在枚举第 ii 位填什么(从 919 \sim 1 枚举,贪心从大到小,在判断如果这一位填了这个数字剩下的全填 amina_{min} 可不可以,可以的话就输出这个数。 就是这么简单,嘻嘻!

    代码环节!

    
    #include <bits/stdc++.h>
    using namespace std;
    
    int n, a[10];
    
    int main() {
    	scanf("%d", &n);
    	int len = 0, m = 1 << 30;
    	for (int i = 1; i <= 9; i++)
    		scanf("%d", &a[i]),
    		m = min(m, a[i]); // a min
    	len = n / m; // 最小位数
    	for (int i = 1; i <= len; i++)
    		for (int j = 9; j; j--) // 一定要从9到 1
    			if ((len - i) * m <= n - a[j]) {
                    // 剩余位数 * a min <= 剩余油漆
    				n -= a[j];
    				printf("%d", j);
    				break;
    			}
    }
    
    
    • 1

    信息

    ID
    1668
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    12
    已通过
    5
    上传者