リンク:https : //codeforces.com/contest/1333
トピック:簡単に言うと、最終的にLLLLLRRRRRになるまでRLをLRに変更し、毎回Lの位置を尋ねます(少なくとも1組の子が毎秒頭を向ける、つまり少なくとも1つの位置が毎回出力されます)nのみ3000、ただの暴力
C ++の操作はより魔法... for(int x:v)の場合、vはコンテナーであり、xはイテレーターに似ており、v内のすべての要素をトラバースするために使用されます。
xラウンドが実行され、cnt操作が合計回数実行されたと仮定します。唯一の解決策は、x <= k、k <= cntの場合です。貪欲は、1つずつ出力してから、kで十分です。
コード:
#include <bits / stdc ++。h> 名前空間stdを使用します。 const int N = 2e5 + 10; int main() { int n、k; char s [3010]; scanf( "%d%d"、&n、&k); scanf( "%s"、s); vector <vector <int>> v; int cnt = 0; while(1) { vector <int> v1; for(int i = 0; i <n-1; i ++) { if(s [i] == 'R' && s [i + 1] == 'L') { v1.push_back(i); cnt ++; swap(s [i]、s [i + 1]); i ++; } } if(v1.empty()) ブレーク; v.push_back(v1); } if(cnt <k || v.size()> k) { printf( "-1 \ n"); 0を返します。 } for(int i = 0; i <v.size(); i ++) { while(v [i] .size()> 1 && k> v.size())// k個のグループを正確に保証 { k--; printf( "1%d \ n"、v [i] .back()+ 1); v [i] .pop_back(); } printf( "%d"、v [i] .size()); for(int j:v [i])//同様のイテレータ printf( "%d \ n"、j + 1); }
}