Educational Codeforces Round 97 1437C Chef Monocarp

   日期:2020-10-31     浏览:107    评论:0    
核心提示:题目链接题目翻译:厨师Monocarp刚刚把n道菜放进了烤箱。他知道第i道菜最佳的烹饪时间是ti 分钟。在任何正整数时间点T,Monocarp最多只能从烤箱中拿出一道菜。如果第i道菜在第T分钟拿出来,那么其不高兴值为 |T-ti| 。一旦菜从烤箱拿出来,就不能再放回去。Monocarp需要将所有菜从烤箱拿出来,求他能得到的最小不开心值。解题思路:动态规划,用数组f[i][j] 表示在第i分钟拿出前j道菜得到的最小不开心值。对于每个i和j,有两种情况,在第i分钟,要么取第j道菜,要么不取第j道
题目链接

题目翻译:

厨师Monocarp刚刚把n道菜放进了烤箱。他知道第i道菜最佳的烹饪时间是ti 分钟。
在任何正整数时间点T,Monocarp最多只能从烤箱中拿出一道菜。如果第i道菜在第T分钟拿出来,那么其不高兴值为 |T-ti| 。一旦菜从烤箱拿出来,就不能再放回去。
Monocarp需要将所有菜从烤箱拿出来,求他能得到的最小不开心值。

解题思路:

动态规划,用数组f[i][j] 表示在第i分钟拿出前j道菜得到的最小不开心值。
对于每个i和j,有两种情况,在第i分钟,要么取第j道菜,要么不取第j道菜。
如果取,那就是在前i-1分钟取完前j-1道菜,然后在第i分钟取第j道菜。那么不开心值就是f[i-1][j-1]+abs(t[j]-i)。其中t[j]表示第j道菜的最佳烹饪时间。
如果不取,那就是在前i-1分钟就取完了前j道菜。不开心值就是f[i-1][j]
所以状态转移公式就是f[i][j]=min(f[i-1][j],f[i-1][j-1]+abs(t[j]-i))
还有一个问题是i的范围是多少,因为ti≤n,所以在得到最小不开心值的前提下,在2*n时间内能取完所有的菜。

代码:
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<cstdio>
#include<cmath>
#define inf 0x3f3f3f3f
using namespace std;
const int N = 410;
int T,n,t[N],f[N][N];
int main() { 
// freopen("1.txt","r",stdin);
	cin>>T;
	while(T--) { 
		cin>>n;
		for(int i=1; i<=n; i++) { 
			cin>>t[i];
		}
		for(int i=0;i<N;i++){ 
			for(int j=0;j<N;j++){ 
				f[i][j]=inf;
			}
		}
		sort(t+1,t+n+1);
		f[0][0]=0;
		for(int i=1;i<=2*n;i++){ 
			f[i][0]=0;
			for(int j=n;j>=1;j--){ 
				f[i][j]=min(f[i-1][j],f[i-1][j-1]+abs(t[j]-i));
			}
		}
		cout<<f[2*n][n]<<endl;
	}
	return 0;
}
代码优化:
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<cstdio>
#include<cmath>
#define inf 0x3f3f3f3f
using namespace std;
const int N = 410;
int T,n,t[N],f[N];
int main() { 
// freopen("1.txt","r",stdin);
	cin>>T;
	while(T--) { 
		cin>>n;
		for(int i=1; i<=n; i++) { 
			cin>>t[i];
		}
		for(int i=0;i<N;i++){ 
			f[i]=inf;
		}
		sort(t+1,t+n+1);
		f[0]=0;
		for(int i=1;i<=2*n;i++){ 
			for(int j=n;j>=1;j--){ 
				f[j]=min(f[j],f[j-1]+abs(t[j]-i));
			}
		}
		cout<<f[n]<<endl;
	}
	return 0;
}
总结:

感觉自己应该写出来的,毕竟这种题目和自己之前刷的题差差不多。
尽管时间充裕。
还是得多刷刷动态规划

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服