AcWing の 82 回目のウィークリー マッチ

k番目の番号

長さ nn の一連の整数 a1,a2,…,ana1,a2,…,an と整数 kk が与えられます。

大小順に並べたkk番目の数列を計算して出力してください。

入力フォーマット

最初の行には、2 つの整数 n、kn、k が含まれています。

2 行目には nn 個の整数 a1,a2,…,ana1,a2,…,an が含まれています。

出力フォーマット

シーケンスを最大から最小に並べ替えた後の kk 番目の数値を表す整数。

データ範囲

最初の 3 つのテスト ポイントは、1≤n≤101≤n≤10 を満たします。
すべてのテスト ポイントは、1≤n≤10001≤n≤1000、1≤k≤n1≤k≤n、0≤ai≤1000≤ai≤100 を満たします。

入力サンプル 1:

5 3
20 10 30 40 10

出力サンプル 1:

20

入力サンプル 2:

6 5
90 20 35 40 60 100

出力サンプル 2:

35

入力サンプル 3:

4 3
4 3 3 2

出力サンプル 3:

3
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++) 
using namespace std;
typedef long long LL; 
int a[1001];
bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
    int n,k;
    cin>>n>>k;
    rep(i,1,n)cin>>a[i];
    sort(a+1,a+1+n,cmp);
    cout<<a[k];
}

ドミノ

n 個のドミノを一列に並べ、各ドミノを垂直に立てます。

最初は、いくつかのドミノが同時に、いくつかは右に、いくつかは左に倒されます。

最初に倒されるドミノのうち、同じ方向に倒れるドミノのうち、少なくとも 1 つは逆方向に倒れるドミノが存在することが保証されます。

1 秒ごとに、左に倒れるドミノは左隣のドミノを倒し、右に倒れるドミノは右隣のドミノを倒します。

ある瞬間に、ドミノの両側にある隣接するドミノが同時にドミノに向かって倒れた場合、力のバランスにより、ドミノは垂直に直立したままになります。

次の図は、このプロセスの例を示しています。

各ドミノの初期状態を考慮して、ノックダウン プロセスが完了した後、垂直のままのドミノの数を決定してください。

入力フォーマット

最初の行には、整数 nn が含まれています。

2 行目には長さ nn の文字列が含まれており、ii 番目の文字は ii 番目のドミノの初期状態を表しています。

  • L ドミノが左に倒れ始めることを示します。
  • R ドミノが右に倒れ始めることを示します。
  • . ドミノが最初に落ちないことを示します。

(i,j)(i,j) に対して保証:

  • i<ji<j で、sisi と sjsj が両方とも である場合 L、i<k<ji<k<j で sksk が であるような kk が存在する必要があります R
  • i<ji<j で、sisi と sjsj が両方とも である場合 R、i<k<ji<k<j で sksk が であるような kk が存在する必要があります L

出力フォーマット

最終的に垂直のままになるドミノの数を表す整数。

データ範囲

最初の 66 個のテスト ポイントは、1≤n≤151≤n≤15 を満たします。
すべてのテスト ポイントは、1≤n≤30001≤n≤3000 を満たします。

入力サンプル 1:

14
.L.R...LR..L..

出力サンプル 1:

4

入力サンプル 2:

5
R....

出力サンプル 2:

0

入力サンプル 3:

1
.

出力サンプル 3:

1
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 3010;

int n;
string s;
int l[N], r[N];
int main () 
{
    cin >> n >> s;
    s = ' ' + s;
    for (int i = 1; i <= n; i ++ ) 
        if (s[i] == 'R') l[i] = i;
        else if (s[i] != 'L') l[i] = l[i - 1];

    for (int i = n; i >= 1; i -- ) 
        if (s[i] == 'L') r[i] = i;
        else if (s[i] != 'R') r[i] = r[i + 1];

    int ans = 0;
    for (int i = 1; i <= n; i ++ )
        if (((!l[i] && !r[i]) || (l[i] && r[i] && i - l[i] == r[i] - i)) && s[i] == '.') ans ++ ;

    cout << ans;
    return 0;
}
 

配列を構築する

0101 シーケンスを作成してください。シーケンスは次のすべての要件を満たす必要があります。

  • 正確に nn 00 と mm 11 が含まれます。
  • 連続する 2 つ以上の 00 はありません。
  • 互いに隣接する行に 3 つ以上の 11 はありません。

入力フォーマット

2 つの整数 n、mn、m を含む合計 1 行。

出力フォーマット

合計1行出力し、条件に合う0101列があれば、次に条件に合う0101列を出力し、なければ出力する -1

答えが一意でない場合は、妥当な答えを出力します。

データ範囲

最初の 66 個のテスト ポイントは、1≤n、m≤101≤n、m≤10 を満たします。
すべてのテスト ポイントは、1≤n、m≤1061≤n、m≤106 を満たします。

入力サンプル 1:

1 2

出力サンプル 1:

101

入力サンプル 2:

4 8

出力サンプル 2:

110110110101

入力サンプル 3:

4 10

出力サンプル 3:

11011011011011

入力サンプル 4:

1 5

出力サンプル 4:

-1

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n, m;
    scanf("%d%d", &n, &m);

    if (m >= n - 1 && m <= 2 * n + 2)
    {
        m -= n - 1;
        if (m == 1) {printf("10"); m = 0;}
        else if (m >= 2) {printf("110"); m -= 2;}
        else printf("0");
        for (int i = 2; i <= n; i ++ )
        {
            if (m >= 1) {printf("110"); m -- ;}
            else printf("10");
        }
        if (m == 2) printf("11");
        if (m == 1) printf("1");
    }
    else puts("-1");

    return 0;
}
 

おすすめ

転載: blog.csdn.net/GeekAlice/article/details/128427325