【好题】dp+排序+贪心——SEERC 2019
标签:sort div turn 排序 emc == ret ons color
/*
首先考虑dp状态:dp[i][j][k]表示考虑了前i个任务,凑成的第一级经验是j,第二级经验是k的用时
由于一级完成任务溢出的经验会给二级,所以任务完成顺序是对结果有影响的:
3 10 2
5 3 4 2
5 4 3 3
2 5 1 4
这组数据,如果先完成任务一或任务二,那么最终是完不成升两级的
那么对于一级完成的任务而言,经验越多的任务放在越后面就越好
所以一开始要给任务以x进行升序排序
*/
#includeusing namespace std;
#define N 1005
#define ll long long
const ll INF=0x3f3f3f3f3f3f3f3f;
struct Node {
ll x,t,y,r;
}p[N];
ll n,s1,s2,dp[2][N][N];
int cmp(Node a,Node b){return a.xb.x;}
int main(){
cin>>n>>s1>>s2;
for(int i=1;i)
cin>>p[i].x>>p[i].t>>p[i].y>>p[i].r;
memset(dp,0x3f,sizeof dp);
dp[0][0][0]=0;
sort(p+1,p+1+n,cmp);
int cur=0;
for(int i=1;i) {
memcpy(dp[cur^1],dp[cur],sizeof dp[cur]);
for(int j=0;j)
for(int k=0;kif(dp[cur][j][k]!=INF){
//p[i]用在第一级上
if(js1){
int nxt=j+p[i].x;
if(nxts1)
dp[cur^1][nxt][k]=min(dp[cur^1][nxt][k],dp[cur][j][k]+p[i].t);
else {
int tmp=nxt-s1+k;if(tmp>s2)tmp=s2;
dp[cur^1][s1][tmp]=min(dp[cur^1][s1][tmp],dp[cur][j][k]+p[i].t);
}
}
//p[i]用在第二级上
int nxt=k+p[i].y;if(nxt>s2)nxt=s2;
dp[cur^1][j][nxt]=min(dp[cur^1][j][nxt],dp[cur][j][k]+p[i].r);
}
cur^=1;
}
if(dp[cur][s1][s2]==INF || dp[cur][s1][s2]==0)cout1‘\n‘;
else cout"\n";
}
/*
2 3 4
3 3 1 1
4 1 4 1
*/
【好题】dp+排序+贪心——SEERC 2019
标签:sort div turn 排序 emc == ret ons color
原文地址:https://www.cnblogs.com/zsben991126/p/12687011.html
评论