• AtCoder Regular Contest 082 ABCD


     A

    1 #include<bits/stdc++.h>
    2 using namespace std;
    3 int a[123456];
    4 int n,m;
    5 int main(){
    6     cin>>n>>m;
    7     cout<<max(0,n-m)<<endl;
    8     return 0;
    9 }

    B

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int a[123456];
     4 int n,m;
     5 int main(){
     6     string s;
     7     cin>>s;
     8     string ans = "";
     9     for (int i = 0; i < s.length(); i += 2)
    10     {
    11         ans += s[i];
    12     }
    13     cout << ans << endl;
    14     return 0;
    15 }

    Problem Statement

    You are given an integer sequence of length Na1,a2,…,aN.

    For each 1≤iN, you have three choices: add 1 to ai, subtract 1 from ai or do nothing.

    After these operations, you select an integer X and count the number of i such that ai=X.

    Maximize this count by making optimal choices.

    Constraints

    • 1≤N≤105
    • 0≤ai<105(1≤iN)
    • ai is an integer.

    Input

    The input is given from Standard Input in the following format:

    N
    a1 a2 .. aN
    

    Output

    Print the maximum possible number of i such that ai=X.


    Sample Input 1

    Copy
    7
    3 1 4 1 5 9 2
    

    Sample Output 1

    Copy
    4
    

    For example, turn the sequence into 2,2,3,2,6,9,2 and select X=2 to obtain 4, the maximum possible count.


    Sample Input 2

    Copy
    10
    0 1 2 3 4 5 6 7 8 9
    

    Sample Output 2

    Copy
    3
    

    Sample Input 3

    Copy
    1
    99999
    

    Sample Output 3

    Copy
    1

    解法:数字-1 +1 或者不变,最后留下数字最多的次数
    解法:那就...讨论一下
    本身的出现次数,i和i+1 i和i+2 i和i+1和i+2的出现次数
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 long long a[123456];
     4 int n;
     5 bool vis[1009];
     6 map<long long,long long>Mp;
     7 int main(){
     8     scanf("%d",&n);
     9     for(int i=1;i<=n;i++){
    10         scanf("%d",&a[i]);
    11         Mp[a[i]]++;
    12     }
    13     long long Max=1;
    14     for(int i=0;i<=100010;i++){
    15             Max=max(Max,Mp[i]);
    16             if(Mp[i]&&Mp[i+1]&&Mp[i+2]){
    17                long long ans=Mp[i]+Mp[i+1]+Mp[i+2];
    18                Max=max(Max,ans);
    19             }
    20             if(Mp[i]&&Mp[i+1]){
    21                long long ans=Mp[i]+Mp[i+1];
    22                Max=max(Max,ans);
    23             }
    24             if(Mp[i]&&Mp[i+2]){
    25                long long ans=Mp[i]+Mp[i+2];
    26                Max=max(Max,ans);
    27             }
    28     }
    29     cout<<Max<<endl;
    30     return 0;
    31 }

    D - Derangement


    Time limit : 2sec / Memory limit : 256MB

    Score : 400 points

    Problem Statement

    You are given a permutation p1,p2,…,pN consisting of 1,2,..,N. You can perform the following operation any number of times (possibly zero):

    Operation: Swap two adjacent elements in the permutation.

    You want to have pii for all 1≤iN. Find the minimum required number of operations to achieve this.

    Constraints

    • 2≤N≤105
    • p1,p2,..,pN is a permutation of 1,2,..,N.

    Input

    The input is given from Standard Input in the following format:

    N
    p1 p2 .. pN
    

    Output

    Print the minimum required number of operations


    Sample Input 1

    Copy
    5
    1 4 3 5 2
    

    Sample Output 1

    Copy
    2
    

    Swap 1 and 4, then swap 1 and 3p is now 4,3,1,5,2 and satisfies the condition. This is the minimum possible number, so the answer is 2.


    Sample Input 2

    Copy
    2
    1 2
    

    Sample Output 2

    Copy
    1
    

    Swapping 1 and 2 satisfies the condition.


    Sample Input 3

    Copy
    2
    2 1
    

    Sample Output 3

    Copy
    0
    

    The condition is already satisfied initially.


    Sample Input 4

    Copy
    9
    1 2 4 9 5 8 7 3 6
    

    Sample Output 4

    Copy
    3
    

    题意:交换相邻的数字,使得ai!=i 问最少的次数

    解法:贪心,反正如果是正确位置上的,我们去交换相邻的就可以了

    #include<bits/stdc++.h>
    using namespace std;
    int a[123456];
    int n;
    bool vis[1009];
    map<int,int>Mp;
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            if(a[i]==i){
                Mp[i]=1;
            }
        }
        int sum=0;
        for(int i=1;i<=n;i++){
            if(Mp[i]==1){
                sum++;
                Mp[i]=0;
                Mp[i+1]=0;
            }
        }
        cout<<sum<<endl;
        return 0;
    }
  • 相关阅读:
    Python并发(一)
    Python协程详解(二)
    Python协程详解(一)
    Python装饰器
    ●BZOJ 3676 [Apio2014]回文串
    ●POJ 3974 Palindrome(Manacher)
    ●BZOJ 1692 [Usaco2007 Dec]队列变换
    ●BZOJ 4698 Sdoi2008 Sandy的卡片
    ●BZOJ 4516 [Sdoi2016]生成魔咒
    ●BZOJ 3238 [Ahoi2013]差异
  • 原文地址:https://www.cnblogs.com/yinghualuowu/p/7468413.html
Copyright © 2020-2023  润新知