码迷,mamicode.com
首页 > 其他好文 > 详细

hdoj 5355 Cake(分析+二分)

时间:2015-08-08 16:26:35      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:

题目链接: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 }

 

hdoj 5355 Cake(分析+二分)

标签:

原文地址:http://www.cnblogs.com/blueprintf/p/4713303.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!