2019杭电暑期多校第四场 C:Divide the Stones(找规律)

【题解】

思路:如果所有的石子重量之和不能被k整除,那么显然是不行的,否则可行。如果分成k堆石子数即n/k为偶数的石子堆,那么我们可以很容易的构造出答案,如果n/k为奇,那么我们可以把n/k看做(3+m),m是一个偶数,首先构造前3*k个石子到k堆,那么剩下的石子m*k就可以看做n/k为偶来分配给k堆。时间复杂度为O(n)。

比如4*4的石子堆,首先我们把他分成:

第一堆:1,5,9,13
第二堆:2,6,10,14
第三堆:3,7,11,15
第四堆:4,8,12,16

 然后隔一列全部倒置,变成:

第一堆:4,5,12,13
第二堆:3,6,11,14
第三堆:2,7,10,15
第四堆:1,8,9,16

就完成啦。 

【代码】

#include 
using namespace std;
#define ll long long
vector  a[110000];
int main()
{
    int t; scanf("%d",&t);
    while(t--){
        int n,k; scanf("%d%d",&n,&k);
        for(int i=0;i

 

你可能感兴趣的:(2019杭电暑期多校第四场 C:Divide the Stones(找规律))