VJ晚训网址点击传送晚训
A题
比较巧的输入方式就是循环n,内层套一个循环7
#include<bits/stdc++.h>
using namespace std;
int main(){int n;cin>>n;for(int i=1;i<=n;i++){int ans=0;for(int j=1;j<=7;j++){int x;cin>>x;ans=ans+x; }cout<<ans<<" ";}return 0;
}
B题
利用string会比较好做,因为可以直接拼接,拼接以后判断回文即可
#include<bits/stdc++.h>
using namespace std;
string s[110];
int main(){int n;cin>>n;for(int i=1;i<=n;i++){cin>>s[i];}for(int i=1;i<=n;i++){string now;for(int j=1;j<=n;j++){if(i==j)continue;now=s[i]+s[j];int len=now.size();bool ok=1; for(int k=0,p=len-1;k<p;k++,p--){if(now[k]!=now[p]){ok=false;break;}}if(ok){cout<<"Yes";return 0;} }}cout<<"No";return 0;
}
C题
这是一个非常经典的括号匹配题目,我们可以不断的存入非右括号字符到数组(手动模拟栈的思想)
记录存入了多少个可以使用的左括号。当我们遇到右括号时,判断前面有没有能用的左括号,如果有那么就不断删除数组尾部的字符,直到我们遇到左括号,也要删除,并且左括号数量-1.如果前面没有可以用的左括号,那么就把右括号也存入数组尾部。
#include<bits/stdc++.h>
using namespace std;
char s[200005];
char op[200005];
int main(){int n;cin>>n;cin>>s+1;int len=0;int num=0;for(int i=1;i<=n;i++){if(s[i]!=')'){if(s[i]=='(')num++;op[++len]=s[i];}else{if(num==0){op[++len]=s[i];}else{while(op[len]!='('){len--;}len--;num--; }}}for(int i=1;i<=len;i++){cout<<op[i];}return 0;
}
D题
简单语法题
#include<bits/stdc++.h>
using namespace std;
char s[200005];
int main(){int n;cin>>n;cin>>s+1;for(int i=1;i<=n;i++){cout<<s[i]<<s[i];}return 0;
}
E题
简单计算题,注意long long int本题不够用
#include<bits/stdc++.h>
using namespace std;
int main(){unsigned long long ans=0;unsigned long long base=1;for(int i=1;i<=64;i++){int x;cin>>x;if(x==1)ans=ans+base;base=base*2;}cout<<ans;return 0;
}
F题
首要要读懂题意
意思就是3*N个数,值域是1–N,只会出现三次
题目的F(i)函数指的是值为i的数字出现的第二次的下标 ,排序所有F(i)以后依次输出对应的i
#include<bits/stdc++.h>
using namespace std;
int vis[100005];
struct pe{int pos; int vel;
}f[100005];
bool cmp(pe x,pe y){return x.pos<y.pos;
}
int main(){int n;cin>>n;for(int i=1;i<=3*n;i++){int x;cin>>x;vis[x]++;if(vis[x]==2){f[x].pos=i;f[x].vel=x;}}sort(f+1,f+1+n,cmp);for(int i=1;i<=n;i++){cout<<f[i].vel<<" ";}return 0;
}
G题
简单递推题(或者说动态规划吧)
我们考虑第i天的状态,要么无毒要么中毒了
定义dp[i][0] 表示第i天吃饭结束后状态为无毒的最大美味度和
定义dp[i][1] 表示第i天吃饭结束后状态为有毒的最大美味度和
对于第i天的菜如果是解毒的,考虑吃还是不吃的问题
如果吃了,那么第i天一定会是无毒的,考虑dp[i][0]可以由昨天怎么变过来?
可以由昨天有毒吃今天的菜 或者 昨天无毒吃今天的菜 的状态转移过来
如果不吃,那么第i天想要无毒状态只能是从昨天的无毒状态转移过来
对于第i天的菜是有毒的,考虑如何吃的问题
我们可以从昨天无毒吃,也可以从昨天有毒今天不吃状态转移,当然最终都是今天中毒的情况
今天也可以不中毒,那就是不吃今天的菜,从昨天无毒转移过来
#include<bits/stdc++.h>
using namespace std;
long long int dp[300005][3];
int main(){int n;cin>>n;for(int i=1;i<=n;i++){int x,y;cin>>x>>y;if(x==0){//当前解毒 dp[i][0]=max(max(dp[i-1][0]+y,dp[i-1][1]+y),dp[i-1][0]);dp[i][1]=dp[i-1][1];//若保持当前毒状态,那么本次就不吃 }else{//当前有毒 dp[i][1]=max(dp[i-1][0]+y,dp[i-1][1]);dp[i][0]=dp[i-1][0];}}cout<<max(dp[n][0],dp[n][1]);return 0;
}