感谢SF巨和WH巨的指导。。
首先,YY得到一个结论,罚值最大的最小值必定是按照截止时间排序得到的。然后,选一个任务插到其他位置,必定产生罚值最大值更大的情况,但有可能产生两个罚值最大情况和更小的情况(此处感谢WH巨)。然而,为什么不是选两个任务调动呢?因为必定会产生两个罚值更大的情况,情况会更坏。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N=505; struct mis{ int s,t; }mission[N]; bool cmp(mis a,mis b){ if(a.t<b.t) return true; else if(a.t==b.t){ if(a.s<b.s) return true; } return false; } int gao(int cur,int to,int n){ int sum=0,cnt=0; int max1=0,max2=0; for(int i=0;i<=n;i++){ if(cnt==to){ sum+=mission[cur].s; max2=max(max2,sum-mission[cur].t); if(max2>max1) swap(max1,max2); // cnt++; } if(i!=cur&&i!=n){ sum+=mission[i].s; max2=max(max2,sum-mission[i].t); if(max2>max1) swap(max1,max2); cnt++; } } return max1+max2; } int main(){ int T,n; scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d%d",&mission[i].s,&mission[i].t); } sort(mission,mission+n,cmp); int ans=gao(-1,10000,n); // cout<<ans<<endl; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ ans=min(ans,gao(i,j,n)); // cout<<ans<<endl; } } printf("%d\n",ans); } return 0; }
时间: 2024-10-04 18:20:01