Codeforces Round #207 (Div. 1) C. Compartments (贪心)
2013-10-23 20:40
495 查看
codeforces题目
题意:
有n个车箱,每个车箱有x(0<=x<=4)个人,若某个车箱的人为1或2个,则该车箱的人会愤怒,因此要说服一些人换车箱,使得所有的车箱的人为0或3或4,问需要说服的最少的人数是多少。若没有可以满足的情况输出-1;
思路:
用的是贪心的思路,由1到2可理解为动1个人可以解决2个车箱的问题,比例为2;由(2,2,2)三个车箱调配的话可理解为动2个人解决3个车箱的问题,比例为1.5;
同理(1,1,1)比例为1.5;其它的依此类推,先处理比例高的,再处理比例低的。
题意:
有n个车箱,每个车箱有x(0<=x<=4)个人,若某个车箱的人为1或2个,则该车箱的人会愤怒,因此要说服一些人换车箱,使得所有的车箱的人为0或3或4,问需要说服的最少的人数是多少。若没有可以满足的情况输出-1;
思路:
用的是贪心的思路,由1到2可理解为动1个人可以解决2个车箱的问题,比例为2;由(2,2,2)三个车箱调配的话可理解为动2个人解决3个车箱的问题,比例为1.5;
同理(1,1,1)比例为1.5;其它的依此类推,先处理比例高的,再处理比例低的。
#include <cstdio> #include <string> #include <iostream> using namespace std; int main() { int n,i,ans; while(scanf("%d",&n)!=EOF) { int a[5]={0}; ans=0; while(n--) { scanf("%d",&i); a[i]++; } if(a[1]>=a[2]) { ans+=a[2]; a[1]-=ans; a[2]-=ans; a[3]+=ans; int k=a[1]/3; ans+=k*2; a[3]+=k; if(a[1]%3==0) printf("%d\n",ans); else if(a[1]%3==1) { if(a[3]>0) printf("%d\n",ans+1); else { if(a[4]>1)printf("%d\n",ans+2); else printf("-1\n"); } } else if(a[1]%3==2) { if(a[4]>0) printf("%d\n",ans+2); else { if(a[3]>1)printf("%d\n",ans+2); else printf("-1\n"); } } } else { ans+=a[1]; a[2]-=ans; a[3]+=ans; int k=a[2]/3; ans+=k*2; a[3]+=k*2; if(a[2]%3==0)printf("%d\n",ans); else if(a[2]%3==1) { if(a[4]>0)printf("%d\n",ans+1); else if(a[3]>1)printf("%d\n",ans+2); else printf("-1\n"); } else printf("%d\n",ans+2); } } return 0; }
相关文章推荐
- ubuntu upgrade problem
- 委托
- adb server is out of date. killing..
- C++宏定义详解
- LINUX常用命令(基础)
- 数字排序问题
- 黑马程序员-String类和它的方法
- Windows环境下多线程编程原理与应用读书笔记(6)————临界段及其应用
- 在Windows XP中为Android 4.0设备安装MTP驱动程序
- epoll机制在搜索引擎spider中的应用
- TYVJ 1434 黑匣子
- jquery 仿163网易图片新闻幻灯片展示
- c++实现socket通信测试
- STL中map的使用
- MFC控件的使用
- android 多屏 多任务
- strtok函数和strtok_r函数的简单实现
- ASP.NET中在不同的子域中共享Session
- 鼠标悬停、事件触发试用,及信号发送
- mysql相关语句笔记