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;
    }

     

  • 相关阅读:
    qt预览的UI界面和实际运行出来的界面分辨率不一样
    QByteArray转QString 例如 0x45 转成 “45”
    QML访问C++成员函数报错:TypeError: Property 'showHome' of object [object Object] is not a function
    Qt生成二维码
    Android解析编译之后的所有文件(so,dex,xml,arsc)格式
    Android逆向之旅---解析编译之后的Dex文件格式
    Android逆向之旅---解析编译之后的Resource.arsc文件格式
    Android逆向之旅---解析编译之后的AndroidManifest文件格式
    Android签名机制之---签名验证过程详解
    Android签名机制之---签名过程详解
  • 原文地址:https://www.cnblogs.com/maybe96/p/9382026.html
Copyright © 2011-2022 走看看