晚训视频讲解3.15晚训视频讲解
晚训网址https://vjudge.net/contest/615489
A题参考程序
#include<bits/stdc++.h>
using namespace std;
char s[110];
int main(){
cin>>s+1;
int n=strlen(s+1);
for(int i=1;i<=n;i++){
int ok=0;
for(int j=1;j<=n;j++){
if(i==j)continue;
if(s[i]==s[j])ok++;
if(ok==1)break;
}
if(ok==0){
cout<<i;return 0;
}
}
return 0;
}
B题参考程序
#include<bits/stdc++.h>
using namespace std;
int pos[110];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int x;
cin>>x;
pos[x]=i;
}
int q;
cin>>q;
while(q--){
int x,y;
cin>>x>>y;
if(pos[x]<pos[y])cout<<x;
else cout<<y;
cout<<'\n';
}
return 0;
}
C题解题思路
因为涉及到Q次修改,我们最终关心的是S字符串里面的每个字符从一开始到最后到底变成什么了,可以用标记数组来解决。定义vis[i]=i ,表示一开始所有第i个字母最终都变成了第i个小写字母。每次修改的时候,把c[i]字符改编成d[i]时,涉及到一个问题,那就是经过若干次修改变化后,我们可能一开始多个vis[i] 都变成了同一个字母,所以说每次修改的时候要判断一下26个字母里面当前变成c[i]的哪几个,然后都修改成 d[i] 。最终输出的时候按照vis[]字母表输出。
#include<bits/stdc++.h>
using namespace std;
int vis[30];
char s[200005];
int main(){
int n;
cin>>n;
cin>>s+1;
int q;
cin>>q;
for(int i=1;i<=26;i++){
vis[i]=i;
}
while(q--){
char x,y;
cin>>x>>y;
int a=x-'a'+1;
int b=y-'a'+1;
for(int i=1;i<=26;i++){
if(vis[i]==a)vis[i]=b;
}
}
for(int i=1;i<=n;i++){
cout<<char(vis[s[i]-'a'+1]-1+'a');
}
return 0;
}
D题参考程序
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
n=n*2+1;
for(int i=1;i<=n;i++){
cout<<i%2;
}
return 0;
}
E题参考程序
#include<bits/stdc++.h>
using namespace std;
long long int A[200005];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>A[i];
}
for(int i=1;i<n;i++){
long long int s,t;
cin>>s>>t;
A[i+1]+=(A[i]/s)*t;
}
cout<<A[n];
return 0;
}
F题参考程序(暴力检查即可)
#include<bits/stdc++.h>
using namespace std;
char s[502][502];//地图
char op[502];//移动字符串
int h,w,n;
bool check(int x,int y,int now){
if(x<1||y<1||x>h||y>w)return false;//越界
if(s[x][y]=='#')return false;//一定要先判断越界
if(now==n+1)return true;
//从s[x][y]出发,检查执行第now步操作能不能行
if(op[now]=='L')return check(x,y-1,now+1);
if(op[now]=='R')return check(x,y+1,now+1);
if(op[now]=='U')return check(x-1,y,now+1);
if(op[now]=='D')return check(x+1,y,now+1);
}
int main(){
cin>>h>>w>>n;
cin>>op+1;
for(int i=1;i<=h;i++){
cin>>s[i]+1;
}
int ans=0;//答案
for(int i=1;i<=h;i++){
for(int j=1;j<=w;j++){
if(s[i][j]=='#')continue;
if(check(i,j,1)==true){
ans++;
}
}
}
cout<<ans;
return 0;
}
G题思路
按照个 十 百 千 拆分即可
#include<bits/stdc++.h>
using namespace std;
int A[10];
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int len=0;
int base=1;//单位
while(n!=0){
int now=n%10;
if(now!=0){
A[++len]=now*base;
}
base=base*10;
n=n/10;
}
cout<<len<<'\n';
for(int i=1;i<=len;i++){
cout<<A[i]<<" ";
}
cout<<'\n';
}
return 0;
}
H题参考程序
#include<bits/stdc++.h>
using namespace std;
int main() {
int t;
cin>>t;
while(t--) {
int n,k;
cin>>n>>k;
int now=n-k;
if(n-k<0) { //先判断能不能拆1
cout<<"No"<<'\n';
continue;
} else {
if(now%2==0) { //如果能拆1判断 能不能摆上去
cout<<"Yes"<<'\n';
cout<<1+now<<" ";
for(int i=1; i<k; i++) {
cout<<1<<" ";
}
cout<<'\n';
continue;
} else { //拆1 摆不上去 试试拆2
now=n-2*k;
if(now<0) {
cout<<"No"<<'\n';
continue;
} else {
if(now%2==0) {
cout<<"Yes"<<'\n';
cout<<2+now<<" ";
for(int i=1; i<k; i++) {
cout<<2<<" ";
}
cout<<'\n';
continue;
}
else{ // 拆1 拆2 都无解就是NO
cout<<"No"<<'\n';
continue;
}
}
}
}
}
return 0;
}