NYOJ 208 并查集的强大应用
2011-11-21 23:10 javaspring 阅读(167) 评论(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;
}
浙公网安备 33010602011771号