大体上的思路是这样的:首先,按照售价顺序排序,然后从最大的开始卖,并且都尽量晚卖出,用并查集标记就好,比较水,不多说,直接上代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>>
using namespace std;
pair<int,int> a[10005];
int father[20005];
int find(int x){
if(x==father[x]) return x;
else
return father[x]=find(father[x]);
}
int main(){
int n;
int i,j,k;
int ans;
while(scanf("%d",&n)!=EOF){
for(i=0;i<20000;i++) father[i]=i;
for(i=0;i<n;i++){
scanf("%d%d",&a[i].first,&a[i].second);
}
sort(a,a+n);
ans=0;
for(i=n-1;i>=0;i--){
// printf("yes1\n");
int ff=find(a[i].first+10000);
//printf("yes2\n");
//printf("%d %d\n",fs,a[i].second);
while(a[i].second){
int date=a[i].second;
int f=find(date);
if(f==date){
father[f]= ff;
ans+=a[i].first;
break;
}
a[i].second--;
}
}
printf("%d\n",ans);
}
return 0;
}
好吧 我用上面的代码过了之后回去仔细想了下。。。。发现根本不用并查集。。。。直接用judge数组标记就好了。。。这件事告诉我们还是别用百度找题目的好啊。。。。
就是一道贪心水题。。。
#include <stdio.h>
#include <string.h>
#include <algorithm>>
using namespace std;
pair<int,int> a[10005];
int judge[20005];
int main(){
int n;
int i,j,k;
int ans;
while(scanf("%d",&n)!=EOF){
memset(judge,0,sizeof(judge));
for(i=0;i<n;i++){
scanf("%d%d",&a[i].first,&a[i].second);
}
sort(a,a+n);
ans=0;
for(i=n-1;i>=0;i--){
// printf("yes1\n");
//printf("yes2\n");
//printf("%d %d\n",fs,a[i].second);
while(a[i].second){
int date=a[i].second;
if(judge[a[i].second]==0){
judge[a[i].second]=1;
ans+=a[i].first;
break;
}
a[i].second--;
}
}
printf("%d\n",ans);
}
return 0;
}