标签:构造 back int cto 情况 sequence lse math ios
给你 \(a\) 个 \(0\),\(b\) 个 \(1\),\(c\) 个 \(2\),\(d\) 个 \(3\),要求排成一个长度为 \(a+b+c+d\) 的数列,相邻两个差的绝对值为 \(1\),并输出任一方案。
分别构造首位置为 \(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 - 构造,贪心
标签:构造 back int cto 情况 sequence lse math ios
原文地址:https://www.cnblogs.com/mollnn/p/12853371.html