• AtCoder Grand Contest 020


    A - Move and Win


    Time limit : 1sec / Memory limit : 512MB

    Score : 300 points

    Problem Statement

    A game is played on a strip consisting of N cells consecutively numbered from 1 to N.

    Alice has her token on cell A. Borys has his token on a different cell B.

    Players take turns, Alice moves first. The moving player must shift his or her token from its current cell X to the neighboring cell on the left, cell X−1, or on the right, cell X+1. Note that it's disallowed to move the token outside the strip or to the cell with the other player's token. In one turn, the token of the moving player must be shifted exactly once.

    The player who can't make a move loses, and the other player wins.

    Both players want to win. Who wins if they play optimally?

    Constraints

    • 2≤N≤100
    • 1≤A<BN
    • All input values are integers.

    Input

    Input is given from Standard Input in the following format:

    N A B
    

    Output

    Print Alice if Alice wins, Borys if Borys wins, and Draw if nobody wins.


    Sample Input 1

    Copy
    5 2 4
    

    Sample Output 1

    Copy
    Alice
    

    Alice can move her token to cell 3. After that, Borys will be unable to move his token to cell 3, so he will have to move his token to cell 5. Then, Alice moves her token to cell 4. Borys can't make a move and loses.


    Sample Input 2

    Copy
    2 1 2
    

    Sample Output 2

    Copy
    Borys
    

    Alice can't make the very first move and loses.


    Sample Input 3

    Copy
    58 23 42
    

    Sample Output 3

    Copy
    Borys
    

    不存在平手啊,我还在想平手,而且和n无关

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int n,a,b;
        cin>>n>>a>>b;
        if((b-a-1)&1)
            cout<<"Alice";
        else cout<<"Borys";
        return 0;
    }

    B - Ice Rink Game


    Time limit : 2sec / Memory limit : 512MB

    Score : 500 points

    Problem Statement

    An adult game master and N children are playing a game on an ice rink. The game consists of K rounds. In the i-th round, the game master announces:

    • Form groups consisting of Ai children each!

    Then the children who are still in the game form as many groups of Ai children as possible. One child may belong to at most one group. Those who are left without a group leave the game. The others proceed to the next round. Note that it's possible that nobody leaves the game in some round.

    In the end, after the K-th round, there are exactly two children left, and they are declared the winners.

    You have heard the values of A1A2, ..., AK. You don't know N, but you want to estimate it.

    Find the smallest and the largest possible number of children in the game before the start, or determine that no valid values of Nexist.

    Constraints

    • 1≤K≤105
    • 2≤Ai≤109
    • All input values are integers.

    Input

    Input is given from Standard Input in the following format:

    K
    A1 A2  AK
    

    Output

    Print two integers representing the smallest and the largest possible value of N, respectively, or a single integer −1 if the described situation is impossible.


    Sample Input 1

    Copy
    4
    3 4 3 2
    

    Sample Output 1

    Copy
    6 8
    

    For example, if the game starts with 6 children, then it proceeds as follows:

    • In the first round, 6 children form 2 groups of 3 children, and nobody leaves the game.
    • In the second round, 6 children form 1 group of 4 children, and 2 children leave the game.
    • In the third round, 4 children form 1 group of 3 children, and 1 child leaves the game.
    • In the fourth round, 3 children form 1 group of 2 children, and 1 child leaves the game.

    The last 2 children are declared the winners.


    Sample Input 2

    Copy
    5
    3 4 100 3 2
    

    Sample Output 2

    Copy
    -1
    

    This situation is impossible. In particular, if the game starts with less than 100 children, everyone leaves after the third round.


    Sample Input 3

    Copy
    10
    2 2 2 2 2 2 2 2 2 2
    

    Sample Output 3

    Copy
    2 3
    

    这个人是和n的大小有关,而且是递增的,二分就好,二分范围搞错和不小心强制转换GG两发,R应该是1e18就够了,1e9*1e9

    #include<bits/stdc++.h>
    using namespace std;
    typedef unsigned long long ll;
    const int N=1e5+5;
    int a[N],k;
    ll la(int x)
    {
        ll L=2,R=(ll)4e18;
        while(L<=R)
        {
            ll mi=(L+R)/2;
            for(int i=1;i<=k;i++)mi=mi/a[i]*a[i];
            if(mi>x)R=(L+R)/2-1;
            else L=(L+R)/2+1;
        }
        L--;
        ll t=L;
        for(int i=1;i<=k;i++)
        L=L/a[i]*a[i];
        if(L==x)return t;
        else return 0;
     
    }
    ll lb(int x)
    {
        ll L=2,R=(ll)4e18;
        while(L<=R)
        {
            ll mi=(L+R)/2;
            for(int i=1;i<=k;i++)mi=mi/a[i]*a[i];
            if(mi<x) L=(L+R)/2+1;
            else R=(L+R)/2-1;
        }
        ll t=L;
        for(int i=1;i<=k;i++)
        L=L/a[i]*a[i];
        if(L==x)return t;
        else return 0;
    }
    int main()
    {
        scanf("%d",&k);
        for(int i=1;i<=k;i++)scanf("%d",&a[i]);
        ll x=lb(2),y=la(2);
        if(!x)printf("-1");
        else printf("%llu %llu",x,y);
        return 0;
    }

    C - Median Sum


    Time limit : 2sec / Memory limit : 512MB

    Score : 700 points

    Problem Statement

    You are given N integers A1A2, ..., AN.

    Consider the sums of all non-empty subsequences of A. There are 2N−1 such sums, an odd number.

    Let the list of these sums in non-decreasing order be S1S2, ..., S2N−1.

    Find the median of this list, S2N−1.

    Constraints

    • 1≤N≤2000
    • 1≤Ai≤2000
    • All input values are integers.

    Input

    Input is given from Standard Input in the following format:

    N
    A1 A2  AN
    

    Output

    Print the median of the sorted list of the sums of all non-empty subsequences of A.


    Sample Input 1

    Copy
    3
    1 2 1
    

    Sample Output 1

    Copy
    2
    

    In this case, S=(1,1,2,2,3,3,4). Its median is S4=2.


    Sample Input 2

    Copy
    1
    58
    

    Sample Output 2

    Copy
    58
    

    In this case, S=(58).


    这个要找比s/2大的数,呜呜呜,就是背包的bitset,还是自己太菜了

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2e6+5;
    bitset<N>V;
    int main()
    {
        int n,s=0;
        scanf("%d",&n);
        V[0]=1;
        for(int i=0,x; i<n; i++)scanf("%d",&x),s+=x,V|=V<<x;
        for(int i=s/2;;i--)
        if(V[i])
        {
            printf("%d
    ",s-i);
            return 0;
        }
    }
  • 相关阅读:
    Microsoft Biztalk Server 2000简介
    BizTalk学习笔记系列之二:实例说明如何使用BizTalk
    BizTalk学习笔记系列之三:企业集成应用和BizTalk
    简单状态机Workflow基于Web应用【转】
    C#类、接口、虚方法和抽象方法
    多表查询语句写法、数据库数字如何转化为汉子、Sql语句拼接
    IsPostBack用法
    Net前台页面如何调用后台cs变量
    aspx页面中写if else 语句的方法,
    查询数据库最大的索引、静态类与非静态类的区别、后台操作DIV样式的方法、C#操作TreeView组件中的一些常用方法及具体实现
  • 原文地址:https://www.cnblogs.com/BobHuang/p/8288717.html
Copyright © 2020-2023  润新知