接着上一次的题解接着写
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,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 }