hdu 3866(贪心)
来源:互联网 发布:python 字典推导式 编辑:程序博客网 时间:2024/05/18 00:07
给出一个物品的价格,和N个人。每个人最多凑a[i]的钱。问如何分配这N个人应该付的钱,使N个人出钱的差距最小。
先算出平均每个人需要付多少钱,如果一个人没有那么多钱,就全付,然后记录差距,让后面钱多的人来填补。重复多次这种操作。具体看代码
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 10005;int p,n;int vis[maxn];struct node{ int pay; int id; bool operator < (const node& T) const{ if(pay==T.pay) return id>T.id; return pay<T.pay; }}tmp[maxn];int ans[maxn];int main(){ int cases; scanf("%d",&cases); while(cases--) { memset(vis,0,sizeof(vis)); scanf("%d%d",&p,&n); int nn = n; long long sum = 0; for(int i=0;i<n;i++) {scanf("%d",&tmp[i].pay); tmp[i].id = i;sum+=tmp[i].pay;} if(sum<p){printf("IMPOSSIBLE\n"); continue;} while(p) { int k = p/nn; int mod = p%nn; sort(tmp,tmp+n); int flag = 0; for(int i=0;i<n;i++) { if(vis[tmp[i].id]) continue; if(tmp[i].pay<=k) { vis[tmp[i].id] = 1; p -= tmp[i].pay; nn--; flag ++; ans[tmp[i].id] = tmp[i].pay; } else break; } if(!flag) { for(int i=n-1;i>=0;i--) { if(vis[tmp[i].id]) continue; if(mod){ mod--; ans[tmp[i].id] = k+1; } else ans[tmp[i].id] = k; } break; } } for(int i=0;i<n-1;i++) printf("%d ",ans[i]); printf("%d\n",ans[n-1]); } return 0;}
阅读全文
0 0
- hdu 3866(贪心)
- HDU 贪心
- 【贪心】hdu
- HDU 3866 Moonfang's Birthday(贪心)
- HDU 2111 Saving HDU(贪心)
- HDU 2111贪心--【Saving HDU】
- HDU 2111 Saving HDU (贪心)
- HDU Saving HDU (贪心)
- HDU 2111 Saving HDU【贪心】
- 【HDU 2111】Saving HDU(贪心)
- HDU.2111 Saving HDU(贪心)
- hdu 1257 dp+贪心
- HDU 1257 DP + 贪心
- hdu pie(二分+贪心)
- hdu 2037 贪心
- 【贪心】hdu 2863
- HDU 4023 贪心+博弈
- 【贪心】HDU 4137
- kubernetes创建资源对象yaml文件例子--pod
- hadoop ha环境搭建
- python 检查编码chardet 并非有效
- 解决方案:No space left on device
- 你真的懂prototype吗
- hdu 3866(贪心)
- SpringBoot项目使用视图解析器解决Circular view path 问题
- adb的常用指令
- PAT(Basic Level)_1036_跟奥巴马一起编程
- MySQL和PostgreSQL的比较
- vector的一些案例,帮助理解vector用法
- CVPR 2017论文解读:特征金字塔网络FPN
- Freemarker中如何遍历List及控制循环次数
- 使用类路径加载资源文件