【openjudge】集合问题
来源:互联网 发布:战争程序员白濑 动漫 编辑:程序博客网 时间:2024/06/05 02:28
集合A中当前各元素之和记为SUM(A),称为A的负荷;SUM(A)与M之差的绝对值称为A的负荷与理想负荷的偏差,简称为A的偏差。把这些整数划分成N个集合的方法是:按照从大到小的顺序,依次为每个整数分别选择一个集合;确定一个整数所属集合时,先计算各集合的负荷,将该整数分配给负荷最小的那个集合。
求使得各集合的偏差之和最小的划分方案中,集合的数目N。如果这样的方案不止一种,则输出各方案中,集合数最大的那种方案的集合数N。
82 4 912 1680 2872
3注意一下优先队列的用法。
【代码】
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<queue>#define inf 2100000000using namespace std;struct hp{int x;bool operator < (const hp &a)const{return a.x<x;}};priority_queue<hp>q;int cmp(int a,int b){return a>b;}int k,M,K,N,ans;hp SUM;int f[1005],a[1005];int main(){scanf("%d",&k);for (int i=1;i<=k;++i) {scanf("%d",&a[i]); if (a[i]>M) M=a[i];}sort(a+1,a+k+1,cmp);for (int N=1;N<=k;++N){for (int i=1;i<=N;++i) q.push((hp){a[i]});for (int i=N+1;i<=k;++i){SUM=q.top(); q.pop();q.push((hp){SUM.x+a[i]});}K=0;for (int i=1;i<=N;++i) K+=abs(M-q.top().x),q.pop();f[N]=K;}ans=inf; int mini;for (int i=k;i>=1;--i) if (ans>f[i]) ans=f[i],mini=i;printf("%d",mini);}
0 0
- openjudge集合问题
- 【openjudge】集合问题
- OpenJudge 2792 集合加法
- openjudge 集合加法
- OPENJUDGE 2815 城堡问题
- OPENJUDGE 1321 棋盘问题
- OpenJudge - 2815:城堡问题
- 【openjudge】迷宫问题
- openjudge城堡问题
- openjudge 租用游艇问题
- OpenJudge 迷宫问题 BFS
- openjudge:跳马问题
- openjudge约瑟夫问题
- OpenJudge - 2815:城堡问题
- openjudge-拨钟问题
- [openjudge 1813] 熄灯问题
- 【Openjudge】约瑟夫问题
- [OpenJudge-NOI]棋盘问题 回溯
- C-055.自己用C语言写的一个正整数的十进制转二进制的代码
- Java中异或运算实现两个整数的交换以及其功能函数实现
- UITabBarController与UINavigationController异同点浅谈
- Triangle Count算法
- POJ 1681 (高斯消元)
- 【openjudge】集合问题
- 百度地图自定义图层----BMapTileCutterJava切图工具网络版
- hdu4864 贪心+平衡二叉搜索树(map)
- 机器学习Python环境安装
- coderforce 489B B. BerSU Ball
- lightoj 1043 - Triangle Partitioning
- 关于socket tcp/ip的理解
- ajax
- Excel Sheet Column Title