• Codeforces Round #723 (Rated for Div 2)


    A. Mean Inequality

    time limit per test: 1 second

    memory limit per test: 256 megabytes

    input: standard input

    output: standard output

    You are given an array (a) of (2n) distinct integers. You want to arrange the elements of the array in a circle such that no element is equal to the the arithmetic mean of its (2) neighbours.

    More formally, find an array (b), such that:

    • (b) is a permutation of (a).
    • For every (i) from (1) to (2n), (b eq frac{b_{i−1} + b-{i+1}}{2}), where (b_{0}=b_{2n}) and (b_{2n+1}=b_{1}) .

    It can be proved that under the constraints of this problem, such array b always exists.

    Input

    The first line of input contains a single integer (t (1leqslant t leqslant 1000)) — the number of testcases. The description of testcases follows.

    The first line of each testcase contains a single integer (n (1leqslant nleqslant 25)) .

    The second line of each testcase contains 2n integers (a_{1},a_{2},cdots ,a_{2n} (1leqslant a_{i}leqslant 109)) — elements of the array.

    Note that there is no limit to the sum of n over all testcases.

    Output

    For each testcase, you should output (2n) integers, (b_{1},b_{2},cdots ,b_{2n}) for which the conditions from the statement are satisfied.

    Example

    input

    3
    3
    1 2 3 4 5 6
    2
    123 456 789 10
    1
    6 9
    

    output

    3 1 4 2 5 6
    123 10 456 789
    9 6
    

    Note

    In the first testcase, array ([3,1,4,2,5,6]) works, as it's a permutation of ([1,2,3,4,5,6]), and (3+42 eq 1, 1+22 eq 4, 4+52 eq 2, 2+62 eq 5, 5+32 eq 6, 6+12 eq 3) .

    Solution

    要求中间数字不为两边数字的平均值(包括第0和n-1个),那么只要排序后头尾交错输出即可。

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <cctype>
    #include <cstring>
    #include <string>
    #include <map>
    #include <set>
    #include <vector>
    #include <list>
     
    using namespace std;
     
    int main()
    {
        int t;
        int n;
        int sta[1005];
     
        scanf("%d", &t);
        for (int i = 0; i < t; i++) {
            scanf("%d", &n);
            for (int i = 0; i < n*2; i++)
                scanf("%d", &sta[i]);
            sort(sta, sta + 2 * n);
     
            printf("%d %d", sta[0], sta[2*n-1]);
            for (int i = 1; i < n; i++) {
                printf(" %d %d", sta[i], sta[2*n-i-1]);
            }
            putchar('
    ');
        }
     
        return 0;
    }
    

    B. I Hate 1111

    time limit per test: 1 second

    memory limit per test: 256 megabytes

    input: standard input

    output: standard output

    You are given an integer (x). Can you make (x) by summing up some number of (11,111,1111,11111,cdots)? (You can use any number among them any number of times).

    For instance,

    • (33=11+11+11)
    • (144=111+11+11+11)

    Input

    The first line of input contains a single integer (t (1leqslant tleqslant 10000)) — the number of testcases.

    The first and only line of each testcase contains a single integer (x (1leqslant xleqslant 109)) — the number you have to make.

    Output

    For each testcase, you should output a single string. If you can make (x), output "YES" (without quotes). Otherwise, output "NO".

    You can print each letter of "YES" and "NO" in any case (upper or lower).

    Example

    input

    3
    33
    144
    69
    

    output

    YES
    YES
    NO
    

    Note

    Ways to make 33 and 144 were presented in the statement. It can be proved that we can't present 69 this way.

    Solution

    可以发现,除了11以外,其他都可以用多个11加1的形式替换:如111可以转换为11*10+1,1111可以转换为11*100+1。那么显然最少10个11可以带走一个1。显然如果一个所给的数不能被11整除,只要有足够的11来带走余下的数即可,否则不可。

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <cctype>
    #include <cstring>
    #include <string>
    #include <map>
    #include <set>
    #include <vector>
    #include <list>
     
    using namespace std;
    
    int main()
    {
        long long k;
        int len, t;
     
       scanf("%d", &t);
       for (int i = 0; i < t; i++) {
           scanf("%lld", &k);
           int k11 = k / 11;
           int klft = k % 11;
           if (k11 / 10 >= klft)  printf("YES
    ");
           else printf("NO
    ");
       }
     
        return 0;
    }
    

    C2. Potions (Hard Version)

    time limit per test: 1 second

    memory limit per test: 256 megabytes

    input: standard input

    output: standard output

    This is the hard version of the problem. The only difference is that in this version (nleqslant 200000). You can make hacks only if both versions of the problem are solved.

    There are (n) potions in a line, with potion (1) on the far left and potion (n) on the far right. Each potion will increase your health by (a_{i}) when drunk. (a_{i}) can be negative, meaning that potion will decrease will health.

    You start with (0) health and you will walk from left to right, from first potion to the last one. At each potion, you may choose to drink it or ignore it. You must ensure that your health is always non-negative.

    What is the largest number of potions you can drink?

    Input

    The first line contains a single integer (n (1leqslant nleqslant 200000)) — the number of potions.

    The next line contains (n) integers (a_{1}, a_{2}, cdots ,a_{n} (−109leqslant a_{i} leqslant 109)) which represent the change in health after drinking that potion.

    Output

    Output a single integer, the maximum number of potions you can drink without your health becoming negative.

    Example

    input

    6
    4 -4 1 -3 1 -3
    

    output

    5
    

    Note

    For the sample, you can drink (5) potions by taking potions (1, 3, 4, 5) and (6). It is not possible to drink all (6) potions because your health will go negative at some point

    Solution

    反悔贪心,如果健康值大于0就一直吃,如果健康值不足,那么就和已经吃的扣血最多的比较。

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <cctype>
    #include <cstring>
    #include <string>
    #include <map>
    #include <set>
    #include <vector>
    #include <list>
    #include <queue>
     
    using namespace std;
     
     
    int main()
    {
        int n;
        int ans = 0;
        long long H = 0;
        priority_queue<int, vector<int>, greater<int>> pq;
        int sta;
        scanf("%d", &n);
        for (int i=0; i<n; i++) {
            scanf("%d", &sta);
            if (H + sta >= 0) {
                pq.push(sta);
                H += (long long)sta;
                ans ++;
            } else if (!pq.empty() && (pq.top() < 0 && pq.top() < sta)) {
                H -= pq.top();
                pq.pop();
                H += (long long)sta;
                pq.push(sta);
            }
        }
     
        printf("%d
    ", ans);
     
        return 0;
    }
    

    by SDUST weilinfox

  • 相关阅读:
    Linux中的DHCP服务
    写出发帖数最多的前几条记录
    nginx和php-fpm调用方式
    redi集群测试
    Redis 3.2.1集群搭建
    linux系统centOS7下搭建redis集群中ruby版本过低问题的解决方法
    nginx与php-fpm通信的两种方式
    Linux安装mongodb总结
    php高并发
    thinkphp5报错
  • 原文地址:https://www.cnblogs.com/weilinfox/p/14837005.html
Copyright © 2020-2023  润新知