标签:++ ret 这一 class image png bit 状态转移方程 eof
/*这道题第一眼看的时候,设f[i]表示1--i的最大空闲时间 但是我们又可以发现,i时刻的最大空闲时间和后面选择任务的持续的时间是有关系的 那么我们就用f[i]来表是i——n的最大空闲时间,即倒着找 那么我们就可以推出两个状态转移方程式 (1):这一时刻没有任务,那么就在上一时刻的最大空闲时间+1:f[i]=f[i+1]+1 (2):这一时刻有任务,f[i]=max(f[i],f[i+s[q].t])s[q].t表示在这个时刻的任务的 持续时间,找出选择哪一个本时刻任务使空闲时间最大化 那么既然是倒着搜,从后往前的任务对应的开始时间自然也要反过来,从大到小 排序,在进行状态刷新的时候,q不断计一下已经到哪一个任务了*/ #include<bits/stdc++.h> using namespace std; #define ll long long const int N = 11000; ll n,k,q=1; ll a[N],f[N]; struct edge { ll p,t; } s[N]; bool cmp(edge a,edge b) { return a.p>b.p; } int main() { memset(a,0,sizeof(a)); memset(f,0,sizeof(f)); cin>>n>>k; for(int i=1; i<=k; i++) { cin>>s[i].p>>s[i].t; a[s[i].p]++; } sort(s+1,s+k+1,cmp);//从大到小 for(ll i=n; i>0; i--)//倒着搜 { if(a[i]==0) f[i]=f[i+1]+1;//本时刻无任务 else { for(ll j=1; j<=a[i]; j++) { f[i]=max(f[i+s[q].t],f[i]);//本时刻有任务 q++;//不断记任务进度 } } } cout<<n-f[1];//最后只需要把最大空闲时间与总时间做差即可 return 0; } /*15 6 1 2 1 6 4 11 8 7 8 2 11 5 13*/
标签:++ ret 这一 class image png bit 状态转移方程 eof
原文地址:https://www.cnblogs.com/xmex/p/10111439.html