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

      接着上一次的题解接着写

      E题,水题,The second line contains integers a1,a2,,ana1,a2,…,an (1ai10001≤ai≤1000) — all the numbers Tanya pronounced while climbing the stairs, in order from the first to the last pronounced number. Passing a stairway with xx steps, she will pronounce the numbers 1,2,,x1,2,…,x in that order

      读有几个1就有几层,然后记录1前面的数字

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 #include <cmath>
     5 #include <set>
     6 using namespace std;
     7 
     8 int main()
     9 {
    10     int n;
    11     cin>>n;
    12     int num[1000],a[1000];
    13     int t=0;
    14     for(int i=0;i<n;i++){
    15         cin>>num[i];
    16         if(i>0&&num[i]==1) a[t++]=num[i-1];
    17     }
    18     cout<<t+1<<endl;
    19     for(int i=0;i<t;i++){
    20         cout<<a[i]<<' ';
    21     }
    22     cout<<num[n-1]<<endl;
    23     return 0;
    24 }

      F题,挺简单的一道题,只是需要模拟,一开始想错了,模拟操作了。TLE了1发

      题意是给两个字符串,每次只能删除两个字符串最前面的一个字符,看什么时候两个字符串相等,字符串可以为空

      先贴一份TLE的代码

      

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <set>
    #include <string>
    using namespace std;
    
    int main()
    {
        string a,b;
        int sum=0;
        cin>>a>>b;
        while(a!=b){
            if(a.length()>b.length()){
                a=a.substr(1,a.length()-1);
                sum++;
            }
            else if(a.length()<b.length()){
                b=b.substr(1,b.length()-1);
                sum++;
            }
            else{
                a=a.substr(1,a.length()-1);
                b=b.substr(1,b.length()-1);
                sum+=2;
            }
        }
        cout<<sum<<endl;
        return 0;
    }

      因为每次都要进行字符串截取的操作,所以就会TLE了

      只需要从后向前比较是否元素相同就行了,如果不同就break;

      最后附上ac的代码

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <set>
    #include <string>
    using namespace std;
    
    int main()
    {
        string a,b;
        int sum=0;
        cin>>a>>b;
        if(a==b){
            cout<<0<<endl;
            return 0;
        }
        int q=a.length()-1;
        int w=b.length()-1;
        while(a[q]==b[w]){
            q--;
            w--;
        }
        sum+=w;
        sum+=q;
        sum+=2;
        cout<<sum<<endl;
        return 0;
    }

       G题,大意就是给一串序列,然后对每一个数都进行一次判断,如果这串序列中不存在于这个数求和为2的次方的数,则删除这个数,问需要删除多少个数。

      思路就是,先打一个表,存2的次方,然后用map存这个序列,然后对序列中的每一个数与2的次方作差,看相减之后的数是否在map里

      

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <set>
    #include <map>
    #include <cstring>
    using namespace std;
    int main()
    {
        int n,m;
        long long two[35];
        long long num[120000];
        map<int,int>s;
        two[0]=1;
        for(int i=1;i<35;i++) two[i]=2*two[i-1];
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>num[i];
            s[num[i]]++;
        }
        int sum=0;
        for(int i=0;i<n;i++){
            int t=0;
            for(int j=0;j<35;j++){
                if(num[i]<two[j]){
                    if(s[two[j]-num[i]]!=0){
                            if(2*num[i]==two[j]){
                                if(s[two[j]-num[i]]>1){
                                    t=1;
                                    break;
                                }
                            }
                            else{
                                t=1;
                                break;
                            }
    
                    }
                }
            }
            if(t==0) sum++;
        }
        cout<<sum<<endl;
        return 0;
    }

    H题,模拟题,给一串由数字组成的字符串看最大能划分成多少份能被三整除的数。

    就是一位一位的判断,如果该位能被三整除,就划分,否则就需要看前一位的情况,然后分情况,分情况。。

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 #include <cmath>
     5 #include <set>
     6 #include <string>
     7 using namespace std;
     8 
     9 int main()
    10 {
    11     string s;
    12     cin>>s;
    13     int sum=0;
    14     int t=0;
    15     for(int i=0;i<s.length();i++)
    16     {
    17       int num=s[i]-'0';
    18       if(num%3==0){
    19         sum++;
    20         t=0;
    21       }
    22       else if(num%3==1)
    23       {
    24           if(t==0) t=1;
    25           else if(t==1){
    26             if(i!=s.length()-1){
    27                 sum++;
    28                 t=0;
    29                 i++;
    30             }
    31           }
    32           else{
    33             sum++;
    34             t=0;
    35         }
    36       }
    37       else
    38       {
    39           if(t==0) t=2;
    40           else if(t==2){
    41             if(i!=s.length()-1){
    42                 sum++;
    43                 t=0;
    44                 i++;
    45             }
    46         }
    47           else{
    48             sum++;
    49             t=0;
    50 
    51         }
    52       }
    53     }
    54     cout<<sum<<endl;
    55     return 0;
    56 }
  • 相关阅读:
    服务器消息机制实现记录
    转载SQL经典代码按某一字段分组取最大(小)值所在行的数据
    记录js获取当前URL
    (原创)xilinx IP建立向导创建的目录和文件都是做什么的?由错误ERROR:HDLCompiler:Instantiating <xx> from unknown module <xx>引发的思考
    [转]NTFS3G的安装和配置
    (原创)Notepad++怎么实现双视图/双窗口?
    (原创)Quartus硬件工程路径改变,nios工程该怎么办?
    (原)verilog中的reg类型变量,一定会综合出触发器吗?
    (Windows)使用纯净版本的系统碟安装系统后没有网卡驱动怎么办?
    [转]NIOS_II的Boot过程分析
  • 原文地址:https://www.cnblogs.com/maybe96/p/9384737.html
Copyright © 2011-2022 走看看