hdu 2850——Load Balancing
2014-11-07 16:35
134 查看
题意:把N个数分成M堆,要和最大的那堆与和最小的那堆的差最小
思路:优先队列
开始的时候直接按照输入的顺序入队列出队列,结果错了。对于这样一组数据,1000 1000 10000 30000,应该是先排大的后排小的。。
在讨论里面有人出了这样一组数据
个人的理解是,题目中说这种分配的问题是NP难的,也就没有一种很好的算法解决这种问题。所以用了hint里面才说只要比测试数据的答案加上1000小就算对了
代码如下:
思路:优先队列
开始的时候直接按照输入的顺序入队列出队列,结果错了。对于这样一组数据,1000 1000 10000 30000,应该是先排大的后排小的。。
在讨论里面有人出了这样一组数据
300000 200000 110000 110000 110000 110000 60000 最优的是(300000 200000) (110000 110000 110000 110000 60000)这样分,相差为0
个人的理解是,题目中说这种分配的问题是NP难的,也就没有一种很好的算法解决这种问题。所以用了hint里面才说只要比测试数据的答案加上1000小就算对了
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; typedef long long ll; struct server { int id; ll tot; bool operator < (const server b) const{ return tot>b.tot; } }; typedef server mission; mission mis[100005]; priority_queue<server> q; int ans[100005]; int main() { //freopen("data.txt","r",stdin); int T; scanf("%d",&T); while(T--) { int n,m; while(!q.empty())q.pop(); scanf("%d%d",&n,&m); for(int i=0;i<m;++i) { server tmp; tmp.id=i; tmp.tot=0; q.push(tmp); } printf("%d\n",n); bool flag=0; for(int i=0;i<n;++i) { scanf("%d",&mis[i].tot); mis[i].id=i; } sort(mis,mis+n); for(int i=0;i<n;++i) { // cout<<mis[i].tot<<' '; server tmp=q.top(); q.pop(); ans[mis[i].id]=tmp.id; tmp.tot+=mis[i].tot; q.push(tmp); } // cout<<endl; for(int i=0;i<n;++i) { printf("%d ",ans[i]); } puts(""); } return 0; }
相关文章推荐
- HDU-2850-Load Balancing(贪心)
- Hdu 2850 Load Balancing (贪心 优先队列)
- HDU 2850 Load Balancing(优先队列)
- hdu 2850 Load Balancing
- hdu 2850 Load Balancing (优先队列 + 贪心)
- hdu 2850 Load Balancing (优先队列 + 贪心)
- HDU 2850 Load Balancing (贪心+优先队列)
- HDU 2850 Load Balancing
- hdu 2117 Just a Numble
- hdu求平均成绩
- hdu 3488 Tour (km 二分图 最小权)
- HDU 2977 Color Squares(广搜)
- hdu 1541 stars
- hdu 1715 大菲波数
- hdu_1312 Red and Black
- hdu 2152 Fruit
- HDU-1044 Collect More Jewels BFS + DFS
- HDU 2138 How many prime numbers(参考博客)
- hdu 1269 迷宫城堡
- ★ HDU 3315 求KM最大时,要求改动最少