hdoj 1789 贪心算法

mac2024-11-18  7

题目的意思是要使Ignatius尽可能少扣分,所以我们要尽量挑分高的优先完成,每个作业都有对应的截至日期和分数。所以最优策略就是优先找分高的,最好在截止日期当天完成(不影响别的作业),如果当天已经有作业占用了,就往前推,如果前面的日期都被别的作业占用了就意味着这个作业不能完成了,就累加到自己定义的失分变量中。

#include <iostream> using namespace std; typedef struct date { int deadline; int score; }date;//结构体数据类型 date ss[1000]; int flag[1001];//表示日期是否被占用 void quicksort(date ss[],int l,int r)//快排 { if(l>=r) return; int i=l; int j=r; int key=ss[l].score; int dead=ss[l].deadline; while(i<j) { while(i<j&&ss[j].score>=key) j--; if(i<j) { ss[i].score=ss[j].score; ss[i].deadline=ss[j].deadline; i++; } while(i<j &&ss[i].score<key) i++; if(i<j) { ss[j].score=ss[i].score; ss[j].deadline=ss[i].deadline; j--; } } ss[i].deadline=dead; ss[i].score=key; quicksort(ss,l,i-1); quicksort(ss,i+1,r); } int main() { int t; cin>>t; while(t--) { int n; cin>>n; for(int i=0;i<1000;i++)//初始化标志变量 { flag[i]=0; } for(int i=0;i<n;i++) { cin>>ss[i].deadline; } for(int i=0;i<n;i++) { cin>>ss[i].score; } quicksort(ss,0,n-1);//按分数从小到大排 int ans=0;//失分变量 for(int v=n-1;v>=0;v--)//从大分数遍历到小分数 { if(flag[ss[v].deadline]==0)//日期未占用 { flag[ss[v].deadline]=1; } else { int m=ss[v].deadline-1;//往前推日期 while(m) { if(flag[m]==0) { flag[m]=1; break; } else { m--; } } if(m==0)//说明这个作业完不成了 ans+=ss[v].score; } } cout<<ans<<endl; } return 0; }
最新回复(0)