我是靠谱客的博主 聪慧犀牛,最近开发中收集的这篇文章主要介绍Codeforces Round #378 (Div. 2) -- C. Epidemic in Monstropolis (贪心模拟),觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
大体题意:
有n个怪兽在排队,告诉你刚开始每个怪兽的体重,只有体重大的怪兽能吃体重小的怪兽!并且只有相邻的怪兽才能吃,吃掉怪兽后体重增加被吃怪兽的体重,告诉你最后的体重序列,问是否存在这样一种吃法! 存在输出 吃的过程!否则输出NO
思路:
这个题在109个样例WA掉了! 思路就偏了!
简单贪心模拟好了!
其实思路也很简单! 因为他只能吃相邻的怪兽,所以序列最后一个怪兽的体重 一定是刚开始怪兽最后几个互相吃来得到的!因此我们可以用vector 来模拟这个队列!
从最后一个怪兽开始找,找到所有体重之和 为 最后结果的最后一个体重时,如果这个区间内的怪兽有一个和其他不相等,那么就可以产生最终的怪兽! 从最大的怪兽开始无论怎样吃都能得到最终的结果!
这样在把这个区间删掉即可!
详细见代码:
#include <bits/stdc++.h>
#define ps push_back
#define mr make_pair
#define fi first
#define se second
#define Max(a,b) (a) > (b) ? (a) : (b)
#define Min(a,b) (a) > (b) ? (b) : (a)
using namespace std;
const int maxn = 500 + 7;
vector<int>v;
int b[maxn];
vector<pair<int,string> >ans;
int main(){
int n;
scanf("%d",&n);
for (int i = 0; i < n; ++i){
int x;
scanf("%d",&x);
v.ps(x);
}
int k;
scanf("%d",&k);
for (int i = 0; i < k; ++i){
scanf("%d", b+i);
}
if (n == 1){
if (k != 1 || v[0] != b[0]) return 0 * puts("NO");
}
int uber = k-1;
bool ok = 0;
while(1){
int i;
int len = v.size();
int sum = 0;
int flag = 0;
int M = 0,Mxp;
for (i = len-1; ~i; --i){
sum += v[i];
if (M < v[i]){
M = v[i];
Mxp = i;
}
if (sum == b[uber]){
flag = 1;
break;
}
}
if (!flag){ ok = 0; break; }
flag = 0;
for (int j = i; j < len; ++j){
if (v[j] != v[i]){
flag = 1;
break;
}
}
if (!flag && len-i > 1){ ok = 0; break; }
int dir = 0;
for (int j = i; j < len; ++j){
if (len-i == 1)break;
if (v[j] != M)continue;
if (j == i){
if (v[j+1] < v[j]){ Mxp = i; dir = 1;break; }
}
else if (j == len-1){
if (v[j-1] < v[j]) { Mxp = len-1;dir =- 1;break; }
}
else {
if (v[j+1] < v[j]) { Mxp = j;dir = 1;break;}
if (v[j-1] < v[j]) { Mxp = j;dir = -1;break;}
}
}
if (dir == 1){
for (int j = Mxp+1; j < len; ++j){
ans.ps(mr(Mxp+1,"R"));
}
for (int j = Mxp-1; j >= i; --j){
ans.ps(mr(j+2,"L"));
}
}
else {
for (int j = Mxp-1; j >= i; --j){
ans.ps(mr(j+2,"L"));
}
for (int j = Mxp+1; j < len; ++j){
ans.ps(mr(i+1,"R"));
}
}
for (int j = i; j < len; ++j) v.pop_back();
--uber;
if (uber == -1){
if ((int)v.size()){ok = 0; break;}
else {ok = 1; break;}
}
if (v.empty()){
if (~uber) { ok = 0; break; }
else {ok = 1; break; }
}
}
if (!ok) puts("NO");
else if (v.empty()){
puts("YES");
for (int i = 0; i < ans.size(); ++i) printf("%d %sn",ans[i].fi, ans[i].se.c_str());
}
return 0;
}
最后
以上就是聪慧犀牛为你收集整理的Codeforces Round #378 (Div. 2) -- C. Epidemic in Monstropolis (贪心模拟)的全部内容,希望文章能够帮你解决Codeforces Round #378 (Div. 2) -- C. Epidemic in Monstropolis (贪心模拟)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复