Codeforces Round #429

本文解析了三道编程题目,包括气球分配问题、博弈论中的奇偶区间选择问题及数组重排以最大化特定函数值的问题。通过示例输入输出展示了问题解决思路。

Table of Contents A. Generous KefaB. GodsendC. Leha and Function

A. Generous Kefa

One day Kefa found n baloons. For convenience, we denote color of i-th baloon as s**i — lowercase letter of the Latin alphabet. Also Kefa has k friends. Friend will be upset, If he get two baloons of the same color. Kefa want to give out all baloons to his friends. Help Kefa to find out, can he give out all his baloons, such that no one of his friens will be upset — print «YES», if he can, and «NO», otherwise. Note, that Kefa's friend will not upset, if he doesn't get baloons at all.

Input

The first line contains two integers n and k (1 ≤ n, k ≤ 100) — the number of baloons and friends.

Next line contains string s — colors of baloons.

Output

Answer to the task — «YES» or «NO» in a single line.

You can choose the case (lower or upper) for each letter arbitrary.

Examples

input

4 2
aabb

output

YES

input

6 3
aacaab

output

NO

Note

In the first sample Kefa can give 1-st and 3-rd baloon to the first friend, and 2-nd and 4-th to the second.

In the second sample Kefa needs to give to all his friends baloons of color a, but one baloon will stay, thats why answer is «NO».

题意:将气球全部发给一些人,每个人不能收到相同颜色的气球,是否可以将气球全部发出去。

#include <bits/stdc++.h>

using namespace std;

char str[105];
int num[30];

int main(int argc, char const *argv[])
{
    int n,k;
    scanf("%d%d",&n,&k);
    scanf("%s",str);

    for(int i=0;i<n;i++)
        num[str[i]-'a']++;
    bool flag = true;
    for(int i=0;i <26;i++) {
        if(num[i]>k) {
            flag = false;
            break;
        }

    }

    if(flag)
        puts("YES");
    else puts("NO");

    return 0;
}

B. Godsend

Leha somehow found an array consisting of n integers. Looking at it, he came up with a task. Two players play the game on the array. Players move one by one. The first player can choose for his move a subsegment of non-zero length with an odd sum of numbers and remove it from the array, after that the remaining parts are glued together into one array and the game continues. The second player can choose a subsegment of non-zero length with an even sum and remove it. Loses the one who can not make a move. Who will win if both play optimally?

Input

First line of input data contains single integer n (1 ≤ n ≤ 106) — length of the array.

Next line contains n integers a1, a2, ..., an (0 ≤ ai ≤ 109).

Output

Output answer in single line. "First", if first player wins, and "Second" otherwise (without quotes).

Examples

input

4
1 3 2 3

output

First

input

2
2 2

output

Second

Note

In first sample first player remove whole array in one move and win.

In second sample first player can't make a move and lose.

题意:博弈,给一个数列,第一个人先手,每次选取一个奇数区间拿走,第二个后手,每次选取一个偶数区间拿走,谁不能动,谁输。

分析:数据量很大,而且不能区间求和,说明这和奇偶相关。

当整个区间为奇数时,先手全部拿走。

当整个区间有奇数个奇数(先手全部拿走)。

当整个区间有偶数个奇数(先手拿的只剩下一个奇数。后手却只能拿不走那个奇数,先手第二次全部拿走)

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e6+5;
int a[maxn];

int main(int argc, char const *argv[])
{
    int n;
    cin>>n;

    long long sum = 0;
    int u;
    int cnt1,cnt2;
    cnt1 = cnt2 = 0;
    for(int i=0; i < n; i++) {
        scanf("%d",&u);
        a[i] = u%2;
        sum+=a[i];

        if(a[i]%2) cnt1++;
        else cnt2++;
    }

    if(sum%2)
        puts("First");
    else {
        if(cnt1>0)
            puts("First");
        else puts("Second");
    }
    return 0;
}

C. Leha and Function

Leha like all kinds of strange things. Recently he liked the function F(n, k). Consider all possible k-element subsets of the set [1, 2, ..., n]. For subset find minimal element in it. F(n, k) — mathematical expectation of the minimal element among all k-element subsets.

But only function does not interest him. He wants to do interesting things with it. Mom brought him two arrays A and B, each consists of m integers. For all i, j such that 1 ≤ i, j ≤ m the condition Ai ≥ Bj holds. Help Leha rearrange the numbers in the array A so that the sum is maximally possible, where A' is already rearranged array.

Input

First line of input data contains single integer m (1 ≤ m ≤ 2·105) — length of arrays A and B.

Next line contains m integers a1, a2, ..., am (1 ≤ ai ≤ 109) — array A.

Next line contains m integers b1, b2, ..., bm (1 ≤ bi ≤ 109) — array B.

Output

Output m integers a'1, a'2, ..., a'm — array A' which is permutation of the array A.

Examples

input

5
7 3 5 3 4
2 1 3 2 3

output

4 7 3 5 3

input

7
4 6 5 8 8 2 6
2 1 2 2 1 1 2

output

2 6 4 5 8 8 6

题意:

F(n,k) 函数,从 1~n 个数中,挑取 k 个数,然后取这个集合中最小的值,F(n,k),就是这个最小值的期望。

推导,F(n,k)=\frac{n+1}{k+1} 没仔细去推。

然后,\sum_{i=1}^mF(A_i',B_i) 最大时,A数组重排。

贪心,A中最大的元素匹配B中最小的元素。

#include <bits/stdc++.h>

using namespace std;
const int maxn = 200005;

struct node {
    int x;
    int id;
}a[maxn],b[maxn];


bool cmp(node a,node b) {
    return a.x < b.x;
}

bool cmp2(node a,node b) {
    return a.x > b.x;
}

bool cmp3(node a,node b) {
    return a.id < b.id;
}

int main() {

    int m;
    scanf("%d",&m);
    for(int i=0; i < m; i++) {
        scanf("%d",&a[i].x);
        a[i].id = i;
    }

    for(int i=0; i < m; i++) {
        scanf("%d",&b[i].x);
        b[i].id = i;
    }

    sort(a,a+m,cmp2);
    sort(b,b+m,cmp);

    for(int i=0; i < m; i++)
        a[i].id = b[i].id;

    sort(a,a+m,cmp3);
    for(int i=0; i < m; i++)
        printf("%d ",a[i].x);

    return 0;
}

转载于:https://www.cnblogs.com/TreeDream/p/7418737.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值