[CF1264B] Beautiful Sequence - 构造,贪心
Posted mollnn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CF1264B] Beautiful Sequence - 构造,贪心相关的知识,希望对你有一定的参考价值。
Description
给你 (a) 个 (0),(b) 个 (1),(c) 个 (2),(d) 个 (3),要求排成一个长度为 (a+b+c+d) 的数列,相邻两个差的绝对值为 (1),并输出任一方案。
Solution
分别构造首位置为 (0,1,2,3) 的情况,对于每个位置,尽量先贪该位 (-1),不满足的话贪该位 (+1)
能绕开各种特判做这道题,还是挺优雅的 ??
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[6],b[6];
signed main() {
ios::sync_with_stdio(false);
for(int i=1;i<=4;i++) cin>>a[i];
for(int k=1;k<=4;k++) {
for(int i=1;i<=4;i++) b[i]=a[i];
int ind=k;
vector<int> v;
v.push_back(ind);
if(b[ind]==0) continue;
b[ind]--;
while(1) {
if(b[ind-1]) {
--ind;
b[ind]--;
v.push_back(ind);
}
else if(b[ind+1]) {
ind++;
b[ind]--;
v.push_back(ind);
}
else break;
}
if(v.size()==a[1]+a[2]+a[3]+a[4]) {
cout<<"YES"<<endl;
for(int i=0;i<v.size();i++) cout<<v[i]-1<<" ";
return 0;
}
}
cout<<"NO";
}
以上是关于[CF1264B] Beautiful Sequence - 构造,贪心的主要内容,如果未能解决你的问题,请参考以下文章
[暑假集训--数位dp]cf55D Beautiful numbers