这道题,贪就对了。
先按照价值排序,从大到小。当前考虑的的就先放到尽可能晚的时间点,为其他的创造机会,如果这一个的所有可用时间段都被占据,就只能扣钱了。
#include<fstream> #include<cmath> #include<iostream> #include<cstdio> #include<cstring> #include <algorithm> using namespace std; bool use[1000],dhs; int m,n; struct f{ int qx,fk; }g[1000]; bool cmp(f a,f b){ return a.fk>b.fk; } int main(){ cin>>m>>n; for(int i=1;i<=n;i++){ scanf("%d",&g[i].qx); } for(int i=1;i<=n;i++){ scanf("%d",&g[i].fk); } sort(g+1,g+n+1,cmp); for(int i=1;i<=n;i++){ if(use[g[i].qx]==0){ use[g[i].qx]=1; } else{ int bj=0; for(int j=g[i].qx-1;j>=1;j--){ if(use[j]==0){ use[j]=1; bj=1; break; } } if(bj==0){ m-=g[i].fk; } } } printf("%d",m); return 0; }