2 条题解

  • 1
    @ 2025-12-7 21:33:04

    问题本质:每次选最大的 x 个非零元素各减 1,直到所有元素为 0,求最少操作次数。

    #include <stdio.h>
    typedef long long ll;  
    int main() {
        int t;
        scanf("%d",&t);
        while (t--){
            int n,x;
            scanf("%d%d",&n,&x);
            ll sum=0,max_a=0;  
            for (int i=0;i<n;++i) {
                ll num;
                scanf("%lld",&num);
                sum+=num;
                if (num>max_a) {
                    max_a=num;
                }
            }
            ll cnt_sum=(sum+x-1)/x;
            ll ans=(cnt_sum>max_a)?cnt_sum:max_a;
            printf("%lld\n",ans);
        }
        return 0;
    }
    
    • @ 2025-12-7 21:39:29

      ll cnt_sum=(sum+x-1)/x代表的意思是操作次数至少等于总元素和除以 x 的向上取整

  • 0
    @ 2025-11-15 21:15:34
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=1e6+5;
    const ll inf=1e18;
    ll t,n,x;
    ll a[N];
    int main(){
    	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    	cin>>t;
    	while(t--){
    		ll mx=0,sum=0;
    		cin>>n>>x;
    		for(int i=1;i<=n;i++){
    			cin>>a[i];
    			sum+=a[i];
    			mx=max(mx,a[i]);
    		}
    		cout<<max(mx,(sum+x-1)/x)<<'\n';
    		//(sum+x-1)/x的操作类似于向上取整,跟ceil函数作用一样
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    1196
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    (无)
    递交数
    50
    已通过
    23
    上传者