codeforces每日两道思维题(第一天)

第一天

2 A. K-divisible Sum

原题链接:Problem - 1476A - Codeforces

rating:1000

题意描述:

你被给定两个整数 n 和 k。

你需要创建一个包含 n 个正整数 a1, a2, …, an 的数组,使得和 (a1+a2+⋯+an) 能够被 k 整除,且数组 a 中的最大元素是可能的最小值。

在这种情况下,数组 a 的可能的最小最大元素是多少?


思路分析:这个题也是一道比较简单的思维题

分为三种情况,

1)当n < k 时,我们让每个数组都取 k/n ,这样因为会出现下取整,整体答案是不够k的,那么再让一部分数字加上1,答案就是k/n+1

2)当n==k时,因为数字个数正好等于总和k,那直接让所有的ai = 1就是答案

3)当n>k时,

因为数字个数大于k,所以想要整除,就必须扩大到能够整除。

若是本身n%k==0 那么直接让ai 都等于 n/k就是答案

如果不能整数,那么就要扩大到距离最近的能够整除的数字,也就是令n = (n/k+1)*k;

那么此时的答案就是n/k

总结:就是让所有的数字尽可能平均,最小和最大差值不要大于1

完整代码:

#include
int t;
long long int  n,k;
int main(){
    std::cin>>t;
    while(t--){
    std::cin>>n>>k;
    if(n<=k)std::cout<<k/n+(k%n!=0)<<std::endl;
    else {
        long long int tn = n;
        if(n%k) n = (n/k+1)*k;
    
        long long int c = n/tn + (n%tn!=0);
        std::cout<<c<<std::endl;
    }
    }
    return 0;
}

你可能感兴趣的:(codeforces每日两题,算法)