Codeforces Round #301 (Div. 2) B. School Marks(贪心)
2016-07-27 16:53
330 查看
题目地址:http://codeforces.com/problemset/problem/540/B
思路:Less表示小于y的数的个数,More表示大于y等于的数的个数。则若Less>=n/2+1时无解,则n/2+1之后应加入的元素个数num为n/2+1-More,为保证总和不超过x,每次加入最小值y。n+2/1之前应加入的元素为n-More-Less-num,同理为保证总和不超过x,每次加入1。若最终总和大于x或者总元素个数小于n,则无解。
思路:Less表示小于y的数的个数,More表示大于y等于的数的个数。则若Less>=n/2+1时无解,则n/2+1之后应加入的元素个数num为n/2+1-More,为保证总和不超过x,每次加入最小值y。n+2/1之前应加入的元素为n-More-Less-num,同理为保证总和不超过x,每次加入1。若最终总和大于x或者总元素个数小于n,则无解。
#include<cstdio> #include<vector> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int num=0; int ans[1050]; int n,k,p,x,y,Less,More,sum=0; int main() { scanf("%d%d%d%d%d",&n,&k,&p,&x,&y); for(int i=0; i<k; i++) { int x; scanf("%d",&x); sum+=x; if(x<y) Less++; else More++; } if(Less>=n/2+1) { printf("-1\n"); exit(0); } int r=n/2+1-More; while(r>0) { r--; ans[num++]=y; sum+=y; } int left=n-More-Less-num; while(left>0) { left--; ans[num++]=1; sum+=1; } if(sum>x||num+k<n) { printf("-1\n"); exit(0); } for(int i=0; i<num-1; i++) printf("%d ",ans[i]); printf("%d\n",ans[num-1]); return 0; }
相关文章推荐
- 字串变换
- Android 事件分发机制(最新源码6.0分析)--childView
- vim常用命令
- Exception异常处理
- HAProxy Tips
- 从什么都不懂开始(二)——创建Project提交到Github需要做什么
- Mysql与Sql server在语法和关键字上的区别
- cifar代码
- HDU 5573 Binary Tree 找规律二进制
- 回调函数初识
- 用shell获得hadoop中mapreduce任务运行结果的状态
- linux基础(4)-常用命令
- 读写应用程序数据-CoreData
- C#发送手机验证码
- cmake
- man,history命令
- AngularJS入门教程之Select(选择框)详解
- Android 自定义View时处理wrap_content和padding的方法
- 鲜为人知而又实用的 Linux 命令大全
- 笔记︱虚拟变量回归=差异显著(方差分析)+差异量化(系数值)