本文主要是介绍杭电OJ 1789:Doing Homework again,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
经典的贪心问题,先按照作业的扣除分数从大到小排序,如果分数相同则按截至日期从小到大排序。然后根据day判断哪些作业可以被安排。注意:for循环中如果存在一个作业符合条件就要跳出循环(因为每天只能安排一个作业)。
C++代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
const int N=1001;
struct homework{int deadline,reduce;bool flag;
}arr[N];
bool cmp(homework a,homework b){if(a.reduce==b.reduce)return a.deadline<b.deadline;return a.reduce>b.reduce;
}
int main(){int T;//freopen("1.txt","r",stdin);scanf("%d",&T);while(T--){int day=0,n;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&arr[i].deadline);if(arr[i].deadline>day)day=arr[i].deadline;}int s=0;for(int i=0;i<n;i++){scanf("%d",&arr[i].reduce);s+=arr[i].reduce;arr[i].flag=false;}sort(arr,arr+n,cmp);int sum=0;while(day){for(int i=0;i<n;i++){if(arr[i].deadline>=day&&arr[i].flag==false){arr[i].flag=true;sum+=arr[i].reduce;break;}}day--;}printf("%d\n",s-sum);}return 0;
}
这篇关于杭电OJ 1789:Doing Homework again的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!