1. 程式人生 > >Problem Archive #1 題解2

Problem Archive #1 題解2

tle bin clas pre != www. algo amp end

  接著上一次的題解接著寫

  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