zoukankan      html  css  js  c++  java
  • AtCoder Beginner Contest 102

    A - Multiple of 2 and N


    Time Limit: 2 sec / Memory Limit: 1024 MB

    Score : 100100 points

    Problem Statement

    You are given a positive integer NN. Find the minimum positive integer divisible by both 22 and NN.

    Constraints

    • 1N1091≤N≤109
    • All values in input are integers.

    Input

    Input is given from Standard Input in the following format:

    NN
    

    Output

    Print the minimum positive integer divisible by both 22 and NN.


    Sample Input 1 Copy

    Copy
    3
    

    Sample Output 1 Copy

    Copy
    6
    

    66 is divisible by both 22 and 33. Also, there is no positive integer less than 66 that is divisible by both 22 and 33. Thus, the answer is 66.


    Sample Input 2 Copy

    Copy
    10
    

    Sample Output 2 Copy

    Copy
    10
    

    Sample Input 3 Copy

    Copy
    999999999
    

    Sample Output 3 Copy

    Copy
    1999999998
    代码:
    import java.util.*;
    
    public class Main {
        
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            int n = in.nextInt();
            if(n % 2 == 1)n *= 2;
            System.out.println(n);
        }
    }

    B - Maximum Difference

    Time Limit: 2 sec / Memory Limit: 1024 MB

    Score : 200200 points

    Problem Statement

    You are given an integer sequence AA of length NN. Find the maximum absolute difference of two elements (with different indices) in AA.

    Constraints

    • 2N1002≤N≤100
    • 1Ai1091≤Ai≤109
    • All values in input are integers.

    Input

    Input is given from Standard Input in the following format:

    NN
    A1A1 A2A2 ...... ANAN
    

    Output

    Print the maximum absolute difference of two elements (with different indices) in AA.


    Sample Input 1 Copy

    Copy
    4
    1 4 6 3
    

    Sample Output 1 Copy

    Copy
    5
    

    The maximum absolute difference of two elements is A3A1=61=5A3−A1=6−1=5.


    Sample Input 2 Copy

    Copy
    2
    1000000000 1
    

    Sample Output 2 Copy

    Copy
    999999999
    

    Sample Input 3 Copy

    Copy
    5
    1 1 1 1 1
    

    Sample Output 3 Copy

    Copy
    0
    代码:
    import java.util.*;
    
    public class Main {
        
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            int n = in.nextInt();
            int max = 0,min = 1000000000;
            for(int i = 0;i < n;i ++) {
                int d = in.nextInt();
                max = Math.max(max, d);
                min = Math.min(min, d);
            }
            System.out.println(max - min);
        }
    }

    C - Linear Approximation

    Time Limit: 2 sec / Memory Limit: 1024 MB

    Score : 300300 points

    Problem Statement

    Snuke has an integer sequence AA of length NN.

    He will freely choose an integer bb. Here, he will get sad if AiAi and b+ib+i are far from each other. More specifically, the sadness of Snuke is calculated as follows:

    • abs(A1(b+1))+abs(A2(b+2))+...+abs(AN(b+N))abs(A1−(b+1))+abs(A2−(b+2))+...+abs(AN−(b+N))

    Here, abs(x)abs(x) is a function that returns the absolute value of xx.

    Find the minimum possible sadness of Snuke.

    Constraints

    • 1N2×1051≤N≤2×105
    • 1Ai1091≤Ai≤109
    • All values in input are integers.

    Input

    Input is given from Standard Input in the following format:

    NN
    A1A1 A2A2 ...... ANAN
    

    Output

    Print the minimum possible sadness of Snuke.


    Sample Input 1 Copy

    Copy
    5
    2 2 3 5 5
    

    Sample Output 1 Copy

    Copy
    2
    

    If we choose b=0b=0, the sadness of Snuke would be abs(2(0+1))+abs(2(0+2))+abs(3(0+3))+abs(5(0+4))+abs(5(0+5))=2abs(2−(0+1))+abs(2−(0+2))+abs(3−(0+3))+abs(5−(0+4))+abs(5−(0+5))=2. Any choice of bb does not make the sadness of Snuke less than 22, so the answer is 22.


    Sample Input 2 Copy

    Copy
    9
    1 2 3 4 5 6 7 8 9
    

    Sample Output 2 Copy

    Copy
    0
    

    Sample Input 3 Copy

    Copy
    6
    6 5 4 3 2 1
    

    Sample Output 3 Copy

    Copy
    18
    

    Sample Input 4 Copy

    Copy
    7
    1 1 1 1 2 3 4
    

    Sample Output 4 Copy

    Copy
    6
    先把所有的值减去对应下标的值,之后的序列是求都减去同一个值后,绝对值的和最小,那么就排序,找到中间位置的值,所有的数减去中间位置的值就可以了,中间位置的左边比他小,右边比他大,减去值后中间的变为0,左边的都增加,右边的豆腐减少,保证减少的小于等于增加的即可。
    代码:
    import java.util.*;
    
    public class Main {
        
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            int n = in.nextInt();
            int [] s = new int[n];
            long d = 0;
            for(int i = 0;i < n;i ++) {
                s[i] = in.nextInt();
                s[i] -= i + 1;
            }
            Arrays.sort(s);
            for(int i = 0;i < n;i ++) {
                d += Math.abs(s[i] - s[n / 2]);
            }
            System.out.println(d);
        }
    }

    D - Equal Cut

    Time Limit: 2 sec / Memory Limit: 1024 MB

    Score : 600600 points

    Problem Statement

    Snuke has an integer sequence AA of length NN.

    He will make three cuts in AA and divide it into four (non-empty) contiguous subsequences B,C,DB,C,D and EE. The positions of the cuts can be freely chosen.

    Let P,Q,R,SP,Q,R,S be the sums of the elements in B,C,D,EB,C,D,E, respectively. Snuke is happier when the absolute difference of the maximum and the minimum among P,Q,R,SP,Q,R,S is smaller. Find the minimum possible absolute difference of the maximum and the minimum among P,Q,R,SP,Q,R,S.

    Constraints

    • 4N2×1054≤N≤2×105
    • 1Ai1091≤Ai≤109
    • All values in input are integers.

    Input

    Input is given from Standard Input in the following format:

    NN
    A1A1 A2A2 ...... ANAN
    

    Output

    Find the minimum possible absolute difference of the maximum and the minimum among P,Q,R,SP,Q,R,S.


    Sample Input 1 Copy

    Copy
    5
    3 2 4 1 2
    

    Sample Output 1 Copy

    Copy
    2
    

    If we divide AA as B,C,D,E=(3),(2),(4),(1,2)B,C,D,E=(3),(2),(4),(1,2), then P=3,Q=2,R=4,S=1+2=3P=3,Q=2,R=4,S=1+2=3. Here, the maximum and the minimum among P,Q,R,SP,Q,R,Sare 44 and 22, with the absolute difference of 22. We cannot make the absolute difference of the maximum and the minimum less than 22, so the answer is 22.


    Sample Input 2 Copy

    Copy
    10
    10 71 84 33 6 47 23 25 52 64
    

    Sample Output 2 Copy

    Copy
    36
    

    Sample Input 3 Copy

    Copy
    7
    1 2 3 1000000000 4 5 6
    

    Sample Output 3 Copy

    Copy
    999999994
    如果是排着去找这三个位置,是O(n^3)的,可以采用折半枚举的技巧,先找到第二个位置,然后两边各自分为两块,用l和r标记,两块的差距尽可能小即可,随着i的右移,lr只需要初始化一次,然后跟着移动即可,i的移动必然会打破原来的平衡,lr只能继续右移,不需要从最初端开始,不然仍然超时。
    java代码:
    import java.util.*;
    
    public class Main {
        
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            int n = in.nextInt();
            long [] s = new long[n + 1];
            for(int i = 1;i <= n;i ++) {
                s[i] = in.nextLong();
                s[i] += s[i - 1];
            }
            int l = 1,r = 3;
            long ans = s[n];
            for(int i = 2;i < n - 1;i ++) {
                long last = s[n];
                while(l < i) {
                    long d = Math.abs(s[i] - s[l] * 2);
                    if(d > last) break;
                    else last = d;
                    l ++;
                }
                l --;
                last = s[n];
                while(r < n) {
                    long d = Math.abs(s[n] + s[i] - s[r] * 2);
                    if(d > last) break;
                    else last = d;
                    r ++;
                }
                r --;
                long max = Math.max(Math.max(Math.max(s[l], s[i] - s[l]), s[r] - s[i]), s[n] - s[r]);
                long min = Math.min(Math.min(Math.min(s[l], s[i] - s[l]), s[r] - s[i]), s[n] - s[r]);
                ans = Math.min(max - min, ans);
            }
            System.out.println(ans);
        }
    }

    c++代码:

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #define Max 200005
    using namespace std;
    typedef long long LL;
    int main() {
        int n;
        int a[Max];
        LL sum[Max] = {0};
        scanf("%d",&n);
        for(int i = 1;i <= n;i ++) {
            scanf("%d",&a[i]);
            sum[i] = sum[i - 1] + a[i];
        }
        LL ans = sum[n];
        int l = 1,r = 3;
        for(int i = 2;i <= n - 2;i ++) {
            LL last = sum[n];
            while(l < i) {
                LL d = abs(sum[i] - sum[l] * 2);
                if(d > last) break;
                else last = d;
                l ++;
            }
            l --;
            last = sum[n];
            while(r < n) {
                LL d = abs(sum[n] + sum[i] - sum[r] * 2);
                if(d > last) break;
                else last = d;
                r ++;
            }
            r --;
            LL up = max(max(max(sum[l],sum[i] - sum[l]),sum[r] - sum[i]),sum[n] - sum[r]);
            LL down = min(min(min(sum[l],sum[i] - sum[l]),sum[r] - sum[i]),sum[n] - sum[r]);
            ans = min(ans,up - down);
        }
        printf("%lld",ans);
    }
  • 相关阅读:
    Win8常用快捷键
    清除远程桌面连接记录
    通过注册表改变“我的文档”等的默认位置,防止系统重装造成数据丢失
    HTML 转义字符对照表
    r语言 函数
    sparkr——报错
    R语言--saprkR基本使用
    r绘图基本
    R绘制中国地图,并展示流行病学数据
    r画饼图
  • 原文地址:https://www.cnblogs.com/8023spz/p/9452315.html
Copyright © 2011-2022 走看看