• AtCoder Beginner Contest 081


    AtCoder Beginner Contest 081

    题目链接:https://abc081.contest.atcoder.jp/

    总结:四道题较为简单,比赛时切完三题rank41,然后D题读错题,一直挂机到结束,rank60,+200分。

    A题:签到题,直接读入字符串判断每个字符的1的个数输出即可。

    AC代码:

     1 #include<iostream>
     2 using namespace std;
     3 char s[4];
     4 int main()
     5 {
     6     cin>>s;
     7     int sum=0;
     8     for(int i=0;i<=2;i++)
     9     {
    10         if(s[i]=='1')sum++;
    11     }
    12     cout<<sum<<endl;
    13     return 0;
    14 }

    B题:直接暴力即可,用另一个数组b[n]存每个数能/2的次数,排序输出b[1]即可。

    AC代码:

     1 #include<iostream>
     2 #include<algorithm>
     3 using namespace std;
     4 int n;
     5 const int maxn = 205;
     6 int a[maxn];
     7 int b[maxn];
     8 int main()
     9 {
    10     cin>>n;
    11     for(int i=1;i<=n;i++)
    12     {
    13         cin>>a[i];
    14         if(a[i]&1)b[i]=0;
    15         else
    16         {
    17             int k = 0;
    18             while(a[i]%2==0)
    19             {
    20                 a[i]/=2;
    21                 k++;
    22             }
    23             b[i]=k;
    24         }
    25     }
    26     sort(b+1,b+1+n);
    27     cout<<b[1]<<endl;
    28     return 0;
    29 }

    C题题意:给定一个数组a[n]和k,求最少删去多少个数使得数组a中只有k个相同的数。

    题解:因为a[i]<200000,所以记录每个数出现的次数,统计一个有多少个不同的数出现。排序之后从出现的第一个数的次数加到第n-k个数出现的次数就是最少删去的数量。

    AC代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<map>
     4 #include<algorithm>
     5 using namespace std;
     6 const int maxn = 200005;
     7 int a[maxn];
     8 int n,k,x;
     9 map<int,int> Q;
    10 int main()
    11 {
    12     cin>>n>>k;
    13     int now = 0;
    14     for(int i=1;i<=n;i++)
    15     {
    16         a[i]=0;
    17     }
    18      for(int i=1;i<=n;i++)
    19     {
    20         cin>>x;
    21         a[x]++;
    22         if(!Q.count(x))
    23         {
    24             Q[x]=1;
    25             now++;
    26         }
    27     }
    28     sort(a+1,a+1+n);
    29     int sum = 0;
    30     for(int i=n-now+1;i<=n-k;i++)
    31     {
    32         sum+=a[i];
    33     }
    34     cout<<sum<<endl;
    35 }

    D题题意:给定一组数,可以进行使ax=ax+ay的操作。求一个方法使得2N次操作内将数组变为不下降序列。(比赛时读错题,以为求最小操作次数。)

    题解:如果都是正数,那么每个数加前一个数必定符合要求,即a1,a1+a2,a2+a3,a3+a4...,负数同理,只不过是反向加回来。如果有正负数,判断一下最大数和最小数的绝对值谁大,给每个数加上绝对值最大的数即可转换为符号相同的数组,求法同上。

    AC代码:

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<map>
     6 using namespace std;
     7 const int maxn = 55;
     8 int x[maxn];
     9 int n;
    10 map<int,int> Q;
    11 int main()
    12 {
    13     cin>>n;
    14     int sum = 0;
    15     int max1 = -1e6-5;
    16     int min1 = 1e6+5;
    17     int now = 0;
    18     for(int i=1;i<=n;i++)
    19     {
    20         cin>>x[i];
    21         Q[x[i]]=i;
    22         max1 = max(max1,x[i]);
    23         min1 = min(min1,x[i]);
    24     }
    25     if(abs(min1)>abs(max1))now = 1;
    26     if(min1<=0&&max1>=0)
    27     {
    28         cout<<2*n-1<<endl;
    29         for(int i=1;i<=n;i++)
    30         {
    31             if(now)cout<<Q[min1]<<" "<<i<<endl;
    32             else cout<<Q[max1]<<" "<<i<<endl;
    33         }
    34     }
    35     else cout<<n-1<<endl;
    36     if(now)
    37     {
    38         for(int i=n;i>1;i--)
    39         {
    40             cout<<i<<" "<<i-1<<endl;
    41         }
    42     }
    43     else
    44     {
    45         for(int i=2;i<=n;i++)
    46         {
    47             cout<<i-1<<" "<<i<<endl;
    48         }
    49     }
    50     return 0;
    51 }
  • 相关阅读:
    基于密度的optics聚类算法
    unicode编码和utf-8编码详解
    聚类分析之k-prototype算法解析
    python学习笔记之正则表达式1
    聚类分析之模糊C均值算法核心思想
    Matlab编程笔记之GUI程序转exe
    Matlab学习笔记之安装教程
    SVPWM原理分析-基于STM32 MC SDK 5.0
    Allego Quick Reports
    SVPWM-实战
  • 原文地址:https://www.cnblogs.com/sortmin/p/8027973.html
Copyright © 2020-2023  润新知