hdu1789----贪心+回溯

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);
}

猜你喜欢

转载自blog.csdn.net/holly_Z_P_F/article/details/81542129