题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5355
分蛋糕的题目,有1-n大小的n个蛋糕,要求平均分成m份,不能切开蛋糕
#include<stdio.h> #include<set> using namespace std; int main(){ set<int>s; set<int>::iterator it; long long n; int m; int part1, T; int ave; int k, l; ]; scanf("%d",&T); while(T--){ scanf("%I64d %d", &n, &m); - > n || (+n)*n/ % m != ) { puts("NO"); continue; } else{ puts("YES"); k = m*; l = n-k+; part1 = l%k+k-; ave = (+part1)*part1/k; //将n分成两部分,一部分是较小的数,可以凑成m个相同的和 //另一部分是较大的数,是2*m的倍数个,可以凑成相同的对 ; i <= part1; ++i){ s.insert(i); } //只把前一部分较小的数放进集合里 ; i < m; ++i){ cnt = res = ; while(res<ave){ it = s.upper_bound(ave-res); res += *--it; w[cnt++] = *it; s.erase(*it); } //二分查找 printf(*(n-part1)/k); ; i < cnt; ++i) printf(" %d",w[i]); ; i < l/k; ++i){ printf(+part1++,n--); } printf("\n"); } } } }