codeforces-733C-greedy

来源:互联网 发布:湖北大学知行学院后街 编辑:程序博客网 时间:2024/06/06 07:55

题目大意:有n个怪兽排成一队,每个怪兽能吃掉与它相邻的并且体重比它小的怪兽,吃掉之后对方的体重就变成了自己的,问最后a序列是否可以变成b序列;

题目解析:首先肯定是将a序列分成连续的一段一段,然后再组合,组合的时候肯定选出一个最大值,而且在区间范围内它相邻有一个比它小的数,吃掉它就可以随便吃了接下来;

AC代码:

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<queue>using namespace std;queue<pair<int,int> >que;int cnt,a[601],b[601];bool solve(int l,int r){if(l==r)return 1;int i,flag,ma=-1,j;for(i=l;i<=r;i++){if(ma<a[i]){ma=a[i];}}flag=0;for(i=l;i<=r;i++){if(a[i]==ma){if(a[i-1]<ma&&i-1>=l)flag=1;if(a[i+1]<ma&&i+1<=r)flag=1;}if(flag==1){break;}}if(flag==1){if(a[i]>a[i+1]){for(j=i+1;j<=r;j++){que.push(make_pair(i-l+cnt,'R'));}for(j=i-1;j>=l;j--){que.push(make_pair(j+1-l+cnt,'L'));}}else {for(j=i-1;j>=l;j--){que.push(make_pair(j+1-l+cnt,'L'));}for(j=i+1;j<=r;j++){que.push(make_pair(cnt,'R'));}}return 1;}return 0;}int main(){int n,flag=1,m,i,sum=0;cnt=1;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]),sum+=a[i];scanf("%d",&m);for(i=1;i<=m;i++)scanf("%d",&b[i]),sum-=b[i];int temp=0,l=1;for(i=1;i<=n;i++){temp+=a[i];if(temp==b[cnt]){if(solve(l,i)==1){l=i+1;cnt++;temp=0;}else {flag=0;break;}}}if(flag==1&&cnt==m+1&&sum==0){printf("YES\n");while(!que.empty()){printf("%d %c\n",que.front().first,que.front().second);que.pop();}}else printf("NO\n");return 0;}


0 0
原创粉丝点击