NYOJ 208 并查集的强大应用
2011-11-21 23:10 javaspring 阅读(166) 评论(0) 编辑 收藏 举报做了这道题,体会到了并查集的强大啊,,,同时也体会到了对并查集的了解和应用的欠缺。。。。。还是太弱啊。。。。。。。。完全想不到的,竟然可以用并查集做,,,神奇。。。。。。。题目:
Supermarket
- 描述
-
A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx that is measured as an integral number of time units starting from the moment the sale begins. Each product takes precisely one unit of time for being sold. A selling schedule is an ordered subset of products Sell ≤ Prod such that the selling of each product x∈Sell, according to the ordering of Sell, completes before the deadline dx or just when dx expires. The profit of the selling schedule is Profit(Sell)=Σx∈Sellpx. An optimal selling schedule is a schedule with a maximum profit.
For example, consider the products Prod={a,b,c,d} with (pa,da)=(50,2), (pb,db)=(10,1), (pc,dc)=(20,2), and (pd,dd)=(30,1). The possible selling schedules are listed in table 1. For instance, the schedule Sell={d,a} shows that the selling of product d starts at time 0 and ends at time 1, while the selling of product a starts at time 1 and ends at time 2. Each of these products is sold by its deadline. Sell is the optimal schedule and its profit is 80.
Write a program that reads sets of products from an input text file and computes the profit of an optimal selling schedule for each set of products.
- 输入
- A set of products starts with an integer 0 <= n <= 10000, which is the number of products in the set, and continues with n pairs pi di of integers, 1 <= pi <= 10000 and 1 <= di <= 10000, that designate the profit and the selling deadline of the i-th product. White spaces can occur freely in input. Input data terminate with an end of file and are guaranteed correct.
- 输出
- For each set of products, the program prints on the standard output the profit of an optimal selling schedule for the set. Each result is printed from the beginning of a separate line.
- 样例输入
-
4 50 2 10 1 20 2 30 1 7 20 1 2 1 10 3 100 2 8 2 5 20 50 10
- 样例输出
-
80 185
#include <iostream> #include <string.h> #include <cstdio> #include <algorithm> using namespace std; const int N=10010; int father[N]; struct good{ int value; int day; }aa[N]; bool cmp(good a,good b){ return a.value<b.value; } int find(int x){ if(x!=father[x]) father[x]=find(father[x]); return father[x]; } int main(){ //freopen("2.txt","r",stdin); int n; while(~scanf("%d",&n)){ for(int i=0;i<N;++i) father[i]=i; int sum=0; for(int i=0;i<n;++i){ scanf("%d%d",&aa[i].value,&aa[i].day); } sort(aa,aa+n,cmp); for(int i=n-1;i>=0;--i){ int b=find(father[aa[i].day]); //printf("b===%d\n",b); if(b>0){ sum+=aa[i].value; father[b]=b-1; //printf("father[%d]==%d\n",aa[i].day,b-1); } } printf("%d\n",sum); } return 0; }
另一种方法:
#include <iostream> #include <string.h> #include <algorithm> #include <cstdio> using namespace std; const int N=10010; struct good{ int value; int day; }aa[N]; int flag[N]; bool cmp(good a,good b){ return a.value<b.value; } int main(){ //freopen("2.txt","r",stdin); int n; while(~scanf("%d",&n)){ memset(flag,0,sizeof(flag)); for(int i=0;i<n;++i) scanf("%d%d",&aa[i].value,&aa[i].day); sort(aa,aa+n,cmp); int sum=0; for(int i=n-1;i>=0;--i){ for(int j=aa[i].day;j>=1;--j){ if(!flag[j]){ sum+=aa[i].value; flag[j]=1; break; } } } printf("%d\n",sum); } return 0; }