zoukankan      html  css  js  c++  java
  • Problem Archive #1 题解1

      刚开比赛就看了A题,题意大意大概就是给一个序列,按照给的步骤,将数列中的 1 变成 2 ,然后将 2 变成 1 ,第三步就是 将 3 变成 4,4变成 3 。。。其实就是奇数不变,偶数减一就行了

    #include <cstdio>
    #include <iostream>
    using namespace std;
    int main()
    {
        int num[100000];
        int n;
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>num[i];
            if(num[i]%2==0) num[i]--;
        }
        cout<<num[0];
        for(int i=1;i<n;i++) cout<<' '<<num[i];
        return 0;
    }

     B题是真的难受,换了几种方法都是是wa16,思路挺简单的,就是找出前k大的数,然后将下标记录一下,最后根据这个下标排下序,然后划分就行了,然后因为数据规模较小,用数组即可(数据大也可以用map)

    贴上代码:

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int main()
    {
        int n,m;
        cin>>n>>m;
        int num[2001]={0};
        int a[n],b[n];
        for(int i=0;i<n;i++)
         {
          cin>>a[i];
          b[i]=a[i];
         }
         sort(a,a+n);
         int sum=0,t=0;
         for(int i=n-1;i>=0;i--)
         {
             num[a[i]]++;
            sum+=a[i];
             t++;
             if(t==m) break;
         }
         cout<<sum<<endl;
         int d=0;
         t=0;
         for(int i=0;i<n;i++)
         {
             d++;
             if(num[b[i]])
             {
                  t++;
                  if(t==m) cout<<d+n-(i+1)<<" ";
                  else cout<<d<<" ";
                  d=0;
                  num[b[i]]--;
             }
         }
         return 0;
    }

    C题就暴力就能过,题意大概就是给一个序列,能否将这个序列分成三个部分(可以为空),满足第一序列和也第三序列和相同,且尽可能大,就是暴力就能过,一个从前向后,一个从后向前,求和比较,相同记录下来,不同则分大于小于,左移右移。(附:如果没有long long 会wa10)

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    using namespace std;
        long long maxn(long long a,long long s){
            if(a>s) return a;
            else return s;
        }
    int main()
    {
        int n;
        long long sum1=0,sum2=0;
        int num[200005];
        cin>>n;
        for(int i=0;i<n;i++) {
            cin>>num[i];
        }
        if(n==1){
            cout<<0<<endl;
            return 0;
        }
        int q=0,w=n-1;
        long long s=0;
        sum1+=num[q];
        sum2+=num[w];
        while(q<w){
            if(sum1<sum2) sum1+=num[++q];
            else if(sum1>sum2) sum2+=num[--w];
            else{
                s=maxn(sum1,s);
                sum1+=num[++q];
                sum2+=num[--w];
            }
        }
        cout<<s<<endl;
        return 0;
    }

    D题字符串操作,题意比较难懂,首先是给两个字符串,以及两种操作方式,即在同一字符串里可以前后交换(即swap(a【i】,a【n-i-1】)),以及两个字符串相同位置交换(swap(a【i】b【i】))。

    ,在操作前需要进行最少多少步对第一个字符串进行更改,能使得之后用两种操作方式变换使得两个字符串相等。

    其实思路蛮容易想的,就是其实在两个字符串中用四个字符是相互关联的(a[i],a[n-i-1],b[i],b[n-1-i])

    如果四个互不相同,则需要变换2次;

    如果有两个相同,则看如果两个相同的都在第一个字符串上就需要变换两次,否则变换一次

    如果有三个相同,则需要变换一次

    如果有两两相同,则看第一个字符串的元素是否相同,如果相同就需要变换两次

    附上代码

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <set>
    using namespace std;
    
    int main()
    {
        int n,m=0;
        string a,b;
        cin>>n;
        cin>>a>>b;
        for(int i=0;i<n/2;i++){
            set<char> s;
            s.insert(a[i]);
            s.insert(a[n-i-1]);
            s.insert(b[i]);
            s.insert(b[n-i-1]);
            if(s.size()==4) m+=2;
            else if(s.size()==3){
                if(a[i]==a[n-i-1]) m+=2;
                else m+=1;
            }
            else if(s.size()==2){
                char c=*s.begin();
                int sum=0;
                if(a[i]==c) sum++;
                if(a[n-i-1]==c) sum++;
                if(b[i]==c) sum++;
                if(b[n-i-1]==c) sum++;
                if(sum==1||sum==3) m+=1;
            }
        }
        if(n%2==1){
            int j=n/2;
            if(a[j]!=b[j]) m++;
        }
        cout<<m<<endl;
        return 0;
    }

     

  • 相关阅读:
    UVA 254 Towers of Hanoi
    UVA 701 The Archeologists' Dilemma
    UVA 185 Roman Numerals
    UVA 10994 Simple Addition
    UVA 10570 Meeting with Aliens
    UVA 306 Cipher
    UVA 10160 Servicing Stations
    UVA 317 Hexagon
    UVA 10123 No Tipping
    UVA 696 How Many Knights
  • 原文地址:https://www.cnblogs.com/maybe96/p/9382026.html
Copyright © 2011-2022 走看看