链接:戳这里
题意:给出n个任务,每个任务有两个属性,t表示这个任务必须在第t天之前完成(包括第t天),e表示这个任务有一个价值,如果一个任务完不成就会丢失这个价值,要求你输出最小的价值损失 你可以在第i天任意的选择任务去做
思路:
这个首先提到的是必须在第t天之前完成,所以我们贪心在第t天最多能得到的最大的价值(可以拿t天之后的,但是t天之前的拿不了) 所以我们每次都去贪心当前的i天能拿的最大价值
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<vector> #include <ctime> #include<queue> #include<set> #include<map> #include<stack> #include<iomanip> #include<cmath> #define mst(ss,b) memset((ss),(b),sizeof(ss)) #define maxn 0x3f3f3f3f #define MAX 1000100 ///#pragma comment(linker, "/STACK:102400000,102400000") typedef long long ll; typedef unsigned long long ull; #define INF (1ll<<60)-1 using namespace std; int n; struct node{ int t,v; bool operator < (const node a) const{ return v>a.v; } }s[1000100]; int vis[1000100]; int main(){ while(scanf("%d",&n)!=EOF){ mst(vis,0); int T=0,sum=0; for(int i=1;i<=n;i++){ scanf("%d",&s[i].t); T=max(T,s[i].t); } for(int i=1;i<=n;i++){ scanf("%d",&s[i].v); sum+=s[i].v; } sort(s+1,s+n+1); int ans=0; for(int i=T;i>=1;i--){ for(int j=1;j<=n;j++){ if(i<=s[j].t && !vis[j]) { ans+=s[j].v; vis[j]=1; break; } } } cout<<sum-ans<<endl; } return 0; }