Problem Archive #1 題解2
接著上一次的題解接著寫
E題,水題,The second line contains integers a1,a2,…,ana1,a2,…,an (1≤ai≤10001≤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就有幾層,然後記錄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