#define int long long#define endl '\n'#define Accepted 0#de_问题 g: 商品总数">
赞
踩
前言:涉及了字符串的题运用了string类,比char要方便很多,建议学习。
题解:
按题意输出。
题解:
循环即可。
/*Keep on going Never give up*/ //#pragma GCC optimize(3,"Ofast","inline") #include<bits/stdc++.h> #define int long long #define endl '\n' #define Accepted 0 #define AK main() #define I_can signed using namespace std; const int maxn =1e5+10; const int MaxN = 0x3f3f3f3f; const int MinN = 0xc0c0c00c; typedef long long ll; const int inf=0x3f3f3f3f; const ll mod=1e9+7; signed main(){ int n; cin>>n; cout<<">>>"; for(int i=0;i<n;i++) cout<<"-"; cout<<">"<<endl; return Accepted; }
题解:
A=B-1=C-2
最后的结果取决于这三者的最小值。
这里是 以A为基准进行计算。(也可以取B或C为基准进行计算)
最后的值是ABC的平均值*3
B=A+1
所以答案如下。
/*Keep on going Never give up*/ //#pragma GCC optimize(3,"Ofast","inline") #include<bits/stdc++.h> #define int long long #define endl '\n' #define Accepted 0 #define AK main() #define I_can signed using namespace std; const int maxn =1e5+10; const int MaxN = 0x3f3f3f3f; const int MinN = 0xc0c0c00c; typedef long long ll; const int inf=0x3f3f3f3f; const ll mod=1e9+7; signed main(){ int x,y,z; cin>>x>>y>>z; int t=min(x,min(y-1,z-2)); cout<<(t+1)*3<<endl; return Accepted; }
题解:
首先增长速率按照2的速率增长(当然不是严格的2,因为有许多顺序行不通)
所以这个时候就不要考虑爆搜了大约
2
50
2^{50}
250(到不了),复杂度爆炸了。
那么考虑递推。
递推公式
dp[i][1][1]=dp[i-1][1][0];
dp[i][1][0]=dp[i-1][0][1]+dp[i-1][0][0];
dp[i][0][1]=dp[i-1][1][1]+dp[i-1][1][0];
dp[i][0][0]=dp[i-1][0][0]+dp[i-1][0][1];
dp[i][x][y] (x,y)为1或0
表示长度为i,切第i位为x,第i-1位为y 的个数
/*Keep on going Never give up*/ //#pragma GCC optimize(3,"Ofast","inline") #include<bits/stdc++.h> #define int long long #define endl '\n' #define Accepted 0 #define AK main() #define I_can signed using namespace std; const int maxn =1e5+10; const int MaxN = 0x3f3f3f3f; const int MinN = 0xc0c0c00c; typedef long long ll; const int inf=0x3f3f3f3f; const ll mod=1e9+7; int dp[55][2][2]; signed main(){ int t; cin>>t; while(t--){ int n; cin>>n; dp[1][1][0]=1,dp[1][0][0]=1; for(int i=2;i<=n;i++){ dp[i][1][1]=dp[i-1][1][0]; dp[i][1][0]=dp[i-1][0][1]+dp[i-1][0][0]; dp[i][0][1]=dp[i-1][1][1]+dp[i-1][1][0]; dp[i][0][0]=dp[i-1][0][0]+dp[i-1][0][1]; } cout<<dp[n][1][0]+dp[n][1][1]+dp[n][0][0]+dp[n][0][1]<<endl; } return 0; }
题解:
tips
利用c++的string类数字转字符串函数可以轻松解决此类问题。
题目既然没说会出现死循环问题,那么就一定会出现123,所以尽管while true即可。
/*Keep on going Never give up*/ //#pragma GCC optimize(3,"Ofast","inline") #include<bits/stdc++.h> #define int long long #define endl '\n' #define Accepted 0 #define AK main() #define I_can signed using namespace std; const int maxn =1e5+10; const int MaxN = 0x3f3f3f3f; const int MinN = 0xc0c0c00c; typedef long long ll; const int inf=0x3f3f3f3f; const ll mod=1e9+7; signed main(){ string s; cin>>s; int odd=0,even=0; while(true){ for(int i=0;i<s.size();i++){ if((s[i]-'0')&1) even++; else odd++; } s=to_string(odd)+to_string(even)+to_string(odd+even); cout<<s<<endl; if(s=="123") break; even=odd=0; } return Accepted; }
题解:
寻找左括号和右阔号的个数
代码:
/*Keep on going Never give up*/ //#pragma GCC optimize(3,"Ofast","inline") #include<bits/stdc++.h> #define int long long #define endl '\n' #define Accepted 0 #define AK main() #define I_can signed using namespace std; const int maxn =1e5+10; const int MaxN = 0x3f3f3f3f; const int MinN = 0xc0c0c00c; typedef long long ll; const int inf=0x3f3f3f3f; const ll mod=1e9+7; signed main(){ string s; cin>>s; int ans=0; for(auto i:s){ if(i=='('||i==')') ans++; } if(ans>=6) cout<<"big"<<endl; else cout<<"small"<<endl; return Accepted; }
题解:
模拟题,熟练掌握字符串后对于此题处理会方便。
数字与字符串之间互相转换。
代码:
/*Keep on going Never give up*/ //#pragma GCC optimize(3,"Ofast","inline") #include<bits/stdc++.h> #define int long long #define endl '\n' #define Accepted 0 #define AK main() #define I_can signed using namespace std; const int maxn =1e5+10; const int MaxN = 0x3f3f3f3f; const int MinN = 0xc0c0c00c; typedef long long ll; const int inf=0x3f3f3f3f; const ll mod=1e9+7; signed main(){ string s; cin>>s; while(s!="13"){ int ans=0; for(auto i:s) ans+=i-'0'; s=to_string(ans*3+1); cout<<s<<endl; } return Accepted; }
题解:
因为题目是蛇形走位环下来的,所以奇数层 反转字符串后输出。
字母循环取用,所以直接取模即可。
代码:
/*Keep on going Never give up*/ //#pragma GCC optimize(3,"Ofast","inline") #include<bits/stdc++.h> #define int long long #define endl '\n' #define Accepted 0 #define AK main() #define I_can signed using namespace std; const int maxn =1e5+10; const int MaxN = 0x3f3f3f3f; const int MinN = 0xc0c0c00c; typedef long long ll; const int inf=0x3f3f3f3f; const ll mod=1e9+7; signed main(){ int n; cin>>n; int cnt=0; for(int i=0;i<n;i++){ for(int j=0;j<n-i-1;j++) cout<<" "; string s=""; for(int j=0;j<i*2+1;j++){ s+=(cnt%26+'A'); cnt++; } if((i+1)&1) cout<<s<<endl; else{ reverse(s.begin(),s.end()); cout<<s<<endl; } } }
题解:
利用string转数字和数字转string的函数轻松AC此题。
按照题意来回变化即可。
/*Keep on going Never give up*/ //#pragma GCC optimize(3,"Ofast","inline") #include<bits/stdc++.h> #define int long long #define endl '\n' #define Accepted 0 #define AK main() #define I_can signed using namespace std; const int maxn =1e5+10; const int MaxN = 0x3f3f3f3f; const int MinN = 0xc0c0c00c; typedef long long ll; const int inf=0x3f3f3f3f; const ll mod=1e9+7; bool che(string s){ int len=s.size(); for(int i=0;i<len/2;i++){ if(s[i]!=s[len-i-1]) return false; } return true; } signed main(){ string s; cin>>s; int cnt=0; if(che(s)){ cout<<"HW"<<endl; return 0; } while(cnt<=10){ if(che(s)){ cout<<cnt<<" "<<s<<endl; return 0; } cnt++; int x=stoll(s); reverse(s.begin(),s.end()); x+=stoll(s); s=to_string(x); } cout<<"NONE"<<endl; return 0; }
题解:
先输出一行1-n
在循环输出下面2~(n-1)行
在输出最后一行即可。
这三段分开来写。
/*Keep on going Never give up*/ //#pragma GCC optimize(3,"Ofast","inline") #include<bits/stdc++.h> //#define int long long #define endl '\n' #define Accepted 0 #define AK main() #define I_can signed using namespace std; const int maxn =1e5+10; const int MaxN = 0x3f3f3f3f; const int MinN = 0xc0c0c00c; typedef long long ll; const int inf=0x3f3f3f3f; const ll mod=1e9+7; signed main(){ int n; cin>>n; if(n==1){ printf(" 1"); return 0; } for(int i=1;i<=n;i++) printf("%3d",i); printf("\n"); for(int i=2;i<=n-1;i++){ printf("%3d",i); for(int j=0;j<n-2;j++) printf(" "); printf("%3d\n",n-i+1); } for(int i=n;i>=1;i--){ printf("%3d",i); } return 0; }
题解:
好家伙,好似是个模拟题。
不过一看数据范围不大,那就不想了,直接把数组开的大一点暴力即可。
我们把数组开的大一点后,把元素放到中间去。
每次循环一个比较大的范围,计算上面的数与下面的数相乘的结果即可(当然你你可以每次移动下面数组的元素,这样也不会超时,但是用数组下标搓一下位置即可,无需移动。)
下图为:模拟让下面数组错位也就是这一块的内容
/*Keep on going Never give up*/ //#pragma GCC optimize(3,"Ofast","inline") #include<bits/stdc++.h> //#define int long long #define endl '\n' #define Accepted 0 #define AK main() #define I_can signed using namespace std; const int maxn =1e5+10; const int MaxN = 0x3f3f3f3f; const int MinN = 0xc0c0c00c; typedef long long ll; const int inf=0x3f3f3f3f; const ll mod=1e9+7; int n,m; int a[maxn],b[maxn]; signed main(){ cin>>n; for(int i=2000;i<2000+n;i++) cin>>a[i]; cin>>m; for(int i=2000-1;i>=2000-m;i--) cin>>b[i]; for(int i=1;i<=m+n-1;i++){ int ans=0; for(int j=1500;j<3500;j++){ ans+=a[j]*b[j-i]; } cout<<ans<<" "; } return 0; }
题解:(本题没验证对不对,因为交不了)
因为范围不大,所以可以开二维数组来储存
第一维是用户
二维是权益
a[x][y]代表用户x是否拥有y个权益
a[x][y]代表角色x是否拥有y个权益
/*Keep on going Never give up*/ //#pragma GCC optimize(3,"Ofast","inline") #include<bits/stdc++.h> //#define int long long #define endl '\n' #define Accepted 0 #define AK main() #define I_can signed using namespace std; const int maxn =1e5+10; const int MaxN = 0x3f3f3f3f; const int MinN = 0xc0c0c00c; typedef long long ll; const int inf=0x3f3f3f3f; const ll mod=1e9+7; bool a[110][110];//用户 bool b[110][110];//角色 signed main(){ int n,m; while(cin>>n>>m){ memset(a,false,sizeof a); memset(b,false,sizeof b); for(int i=0;i<m;i++){ int opt,x,y; cin>>opt>>x>>y; if(opt==1) a[y][x]=true; if(opt==2) b[y][x]=true; if(opt==3){ for(int j=0;j<30;j++){ if(b[x][j]) a[y][j]=true; } } if(opt==4){ if(a[x][y]) cout<<"yes"<<endl; else cout<<"no"<<endl; } } } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。