题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355
分蛋糕的题目,有1-n大小的n个蛋糕,要求平均分成m份,不能切开蛋糕
1 #include<stdio.h> 2 #include<set> 3 using namespace std; 4 int main(){ 5 set<int>s; 6 set<int>::iterator it; 7 long long n; 8 int m; 9 int part1, T; 10 int ave; 11 int k, l; 12 int cnt, res, w[40]; 13 scanf("%d",&T); 14 while(T--){ 15 scanf("%I64d %d", &n, &m); 16 if( m*2-1 > n || (1+n)*n/2 % m != 0) { 17 puts("NO"); 18 continue; 19 } 20 else{ 21 puts("YES"); 22 k = m*2; 23 l = n-k+1; 24 part1 = l%k+k-1; 25 ave = (1+part1)*part1/k; 26 //将n分成两部分,一部分是较小的数,可以凑成m个相同的和 27 //另一部分是较大的数,是2*m的倍数个,可以凑成相同的对 28 for( int i = 1; i <= part1; ++i){ 29 s.insert(i); 30 } 31 //只把前一部分较小的数放进集合里 32 for( int i = 0; i < m; ++i){ 33 cnt = res = 0; 34 while(res<ave){ 35 it = s.upper_bound(ave-res); 36 res += *--it; 37 w[cnt++] = *it; 38 s.erase(*it); 39 } 40 //二分查找 41 printf("%I64d",cnt+2*(n-part1)/k); 42 for( int i = 0; i < cnt; ++i) 43 printf(" %d",w[i]); 44 for( int i = 0; i < l/k; ++i){ 45 printf(" %d %I64d",1+part1++,n--); 46 } 47 printf("\n"); 48 } 49 } 50 } 51 }
时间: 2024-10-14 20:43:02