Problem Archive #1 题解2

Posted maybe96

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于Problem Archive #1 题解2的主要内容,如果未能解决你的问题,请参考以下文章

2021-2022-1 ACM集训队每周程序设计竞赛题解

题解报告:hdu 1032 The 3n + 1 problem

洛谷 P1303 A*B Problem(高精度乘法) 题解

洛谷 P1003 铺地毯 题解

2019 GUDT WPTC 1 Div2 Problem E(题解) codeforces 115B

[UVA - 10382] Watering Grass 题解