以下の内容はhttps://kmjp.hatenablog.jp/entry/2026/03/25/0930より取得しました。


Codeforces #1082 : Div1 B. Recollect Numbers

これもそこそこの時間で解けはした。
https://codeforces.com/contest/2201/problem/B

問題

整数N,Kが与えられる。
1~Nのカードが2枚ずつ、計2N枚のカードで神経衰弱をする。
最適な手順で端からカードをめくったとき、めくる回数がK組となるカードの並びを答えよ。

解法

N枚に対し、めくる回数は最小はN組、最大(2N-1)組となる。
ここから再帰的にNを下げていこう。

  • K=2N-1のとき、1,2,3,2,4,3,5,4,....,N,1と配置すると(2N-1)組かかる。
  • K<2N-1の時、末尾に2枚をNにすると、N,Kを1小さい状態にできる。
int T,N,K;
int A[606060];

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>T;
	while(T--) {
		cin>>N>>K;
		int L=N,R=2*N-1;
		if(K<L||K>R) {
			cout<<"NO"<<endl;
			continue;
		}
		vector<int> V;
		while(N) {
			int L=N,R=2*N-1;
			
			if(K>L&&K<R) {
				V.push_back(N);
				V.push_back(N);
				N--;
				K--;
			}
			else if(K==L) {
				V.push_back(N);
				V.push_back(N);
				N--;
				K--;
			}
			else {
				V.push_back(1);
				V.push_back(2);
				for(x=3;x<=N;x++) {
					V.push_back(x);
					V.push_back(x-1);
				}
				V.push_back(N);
				V.push_back(1);
				K=N=0;
			}
		}
		assert(K==0);
		cout<<"YES"<<endl;
		FORR(a,V) cout<<a<<" ";
		cout<<endl;
		
	}
}

まとめ

ここら辺はまだよかったんだけどな。




以上の内容はhttps://kmjp.hatenablog.jp/entry/2026/03/25/0930より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14