博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 5835 - Danganronpa ( 贪心 )
阅读量:5145 次
发布时间:2019-06-13

本文共 1664 字,大约阅读时间需要 5 分钟。

题意

给学生发礼物, 学生的桌子排成一行, 要求每个学生发两个礼物, 一种普通礼物, 一种特殊礼物(随意), 要求相邻的普通礼物不能相同

思路

每个学生准备两个礼物, 记礼物总数为sum, 则至多能分给sum/2个学生.

贪心 : 为保证相邻的普通礼物不同, 故尽可能多的放数量多的礼物, 中间插空放数量少的礼物, 当只剩一种礼物且上一次放的就是这个礼物的时候, 不能再继续放礼物, 贪心结束.

AC代码

#include 
#include
#include
#include
#include
#define mst(a) memset(a, 0, sizeof a)using namespace std;const int maxn = 10+5;const int INF = 0x3f3f3f3f;int a[maxn];bool cmp(int a, int b){ return a > b;}int main(){ int T, n, sum, x, all; int kase = 0; scanf("%d",&T); while(T--){ sum = 0, all = 0; scanf("%d",&n); for( int i = 0; i < n; i++ ){ scanf("%d",&a[i]); all += a[i]; } if( n == 1 && all >= 2 ){ printf("1\n"); continue; } else if( all < 2 ){ printf("0\n"); continue; } sort(a, a+n, cmp); int flag = 1; int i; int remain = n; while( sum < all/2 ){ if( flag ){ //取大 i = 0; while( a[i] == 0 ){ i++; } a[i]--; if( a[i] == 0 ) remain--; } else{ i = n-1; while( a[i] == 0 ){ i--; } a[i]--; if( a[i] == 0 ) remain--; } sum++; if( remain == 1 && flag ) break; flag = !flag; //printf("%d ",sum); } printf("Case #%d: %d\n",++kase,sum); } return 0;}

转载于:https://www.cnblogs.com/JinxiSui/p/9740544.html

你可能感兴趣的文章
FastDFS和apache/nginx整合
查看>>
收集一些常用的正则表达式
查看>>
Ajax之eval()函数
查看>>
Java通过图片url地址获取图片base64位字符串的两种方式
查看>>
spring事务源码分析结合mybatis源码(一)
查看>>
加颜色
查看>>
Nginx-负载均衡实现解读
查看>>
Set(集合)
查看>>
文本内容只显示两行,然后加...
查看>>
<知识整理>2019清北学堂提高储备D4
查看>>
ios基础控件之UITextView 2015-04-08 16:36 186人阅读 评论(0) 收藏...
查看>>
android与c# socket通信出现java.net.SocketTimeoutException错误
查看>>
基础小问题
查看>>
软件工程10道题
查看>>
python之打印日志logging
查看>>
相位插值
查看>>
C语言其他知识总结
查看>>
考勤系统 人员排班设置
查看>>
PHP获取自然周列表,周开始结束日期,月开始结束时间方法类
查看>>
汇编学习总结
查看>>