コードフォースラウンド#632 D(思考ベクトルの使用)

リンク: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);
    } 
}
 

 

 

おすすめ

転載: www.cnblogs.com/sweetlittlebaby/p/12667850.html