hdu1789 链接题目传送
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define N 10010
int v[N],T,sum,n,flag;
struct node{int x,y;};
bool cmp(node a,node b){
if(a.y==b.y) return a.x<b.x;//扣分相同 日期小的排前边
else return a.y>b.y;//扣分不同 空分多的拍前边
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);
cin>>T;
while(T--){
cin>>n;node a[n];
for(int i=0;i<n;i++)cin>>a[i].x;
for(int i=0;i<n;i++)cin>>a[i].y;
sort(a,a+n,cmp);
memset(v,0,sizeof(v));sum=0;
for(int i=0;i<n;i++){
flag=0;
for(int j=a[i].x;j>0;j--){//按照截止日期向前回溯
if(!v[j]){
v[j]=1;flag=1;break;
}
}
if(!flag)sum+=a[i].y;
}
cout<<sum<<endl;
}
}
链接51nod1163
有个问题 时间范围是1e9 开不了这么大的数组 可是开了1e5 还是交对了---可能题目不够严谨吧
代码
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct {
int time,val;
}node;
typedef long long ll;
const int maxn=50000+9;
node a[maxn];
bool cmp(node a,node b){
if(a.val!=b.val) return a.val>b.val;
else return a.time<b.time;
}
int n;
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&a[i].time,&a[i].val);
}
sort(a,a+n,cmp);
int v[maxn];
ll ans=0;
memset(v,0,sizeof(v));
for(int i=0;i<n;i++){
for(int j=a[i].time;j>0;j--){//往回找
if(v[j]==0){
v[j]=1;ans+=a[i].val;
break;
}
}
}
printf("%I64d\n",ans);
}