A. Space Navigation
签到题
#include<bits/stdc++.h> #include<iostream> #include<map> #include<cstdio> #include<cmath> #define mem(a,b) memset(a,b,sizeof a) #define ll long long int using namespace std; map<char,int>mp; int main() { int t; cin>>t; while(t--) { mp.clear(); int x,y; cin>>x>>y; string s; cin>>s; for(int i=0;i<s.length();i++) { mp[s[i]]++; } bool flag = true; // cout<<mp['R']<<" "<<mp['L']<<mp['U']<<mp['D']<<endl; if(x>0&&mp['R']<abs(x)) { flag = false; } if(x<0&&mp['L']<abs(x)) { flag = false; } if(y>0&&mp['U']<abs(y)) { flag = false; } if(y<0&&mp['D']<abs(y)) { flag = false; } if(!flag ) { puts("NO"); } else{ puts("YES"); } } }
B. New Colony
题意:有k块石头从i=1的地方落下,如果h[i]<h[i+1]那么那块石头会停在那个地方,并把那个地方的高度加1,问第k块石头在那,如果没在这中间输出-1.
题解:直接暴力求解。
#include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof a) #define ll long long int using namespace std; int h[1010]; int n,k; bool check() { for(int i=1;i<=n;i++) { if(h[i]<h[i+1]) return false; } return true; } int main() { int t; cin>>t; while(t--) { mem(h,0); cin>>n>>k; for(int i=1;i<=n;i++) { cin>>h[i]; } int ans = 0; int q = 0; while(!check()) { for(int i=1;i<=n;i++) { if(h[i]<h[i+1]) { q = i; h[i]++; break; } } ans++; if(ans==k) break; } /*for(int i=1;i<=n;i++) { cout<<h[i]<<" "; } cout<<endl;*/ if(ans<k||q==0) { puts("-1"); } else{ cout<<q<<endl; } } }
C. Fence Painting
题意:给出三个数组,让第数组a变成数组b,按照数组c的元素改变数组a,问是否可以形成数组b,如果可以并且按次序输出c要改变的位置。
题解:先把a和b数组不一样的位置统计出来,并用set[b[i]]存储,然后再遍历一遍c看set[c[i]]是否为空,如果为空开一个vector vv存一下,如果不为空那么我们就可以把vector vv里的数改变的位置全为set[c[j]].begin()的位置。再开一个vector v存一下他们改变的位置。最后判断一下是否都改完了,如果vv不为空最后那我们判断一下vv的最后一个元素是否再b数组中出现过,那么我们同样全部取这个位置,。
#include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof a) #define ll long long int using namespace std; int a[100100],b[100010],c[100100]; set<int>v1[100100]; set<int>v2[100010]; vector<int>v; vector<int >vv; map<int,int>mp; int main() { int t; cin>>t; while(t--) { v.clear(); vv.clear(); mp.clear(); int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { v1[i].clear(); v2[i].clear(); } for(int i=1;i<=n;i++) { cin>>a[i]; } for(int i=1;i<=n;i++) { cin>>b[i]; mp[b[i]] =i; if(b[i]==a[i]) { continue; } else{ v2[b[i]].insert(i); } } for(int i=1;i<=m;i++) { cin>>c[i]; } for(int i=1;i<=m;i++) { if(v2[c[i]].size()!=0) { for(int j=0;j<vv.size();j++) { v.push_back(*v2[c[i]].begin()); } vv.clear(); v.push_back(*v2[c[i]].begin()); v2[c[i]].erase(*v2[c[i]].begin()); } else{ vv.push_back(c[i]); } } bool flag = true; int ans = vv.size(); int pp = -1; for(int i=0;i<vv.size();i++) { if(mp[vv[i]]) { pp = i; v.push_back(mp[vv[i]]); ans--; } else{ break; } } for(int i=1;i<=n;i++) { if(v2[i].size()!=0) { //cout<<i<<"xx"<<endl; flag = false; break; } } //cout<<flag<<endl; if(ans==0&&flag) { //cout<<"1xxx"<<endl; puts("YES"); for(int i=0;i<v.size();i++) { cout<<v[i]<<" "; } cout<<endl; continue; } if(ans!=0&&flag &&mp[vv[vv.size()-1]]) { //cout<<ans<<endl; //cout<<"xxx"<<endl; puts("YES"); for(int i=0;i<v.size();i++) { cout<<v[i]<<" "; } for(int i=pp+1;i<vv.size();i++) { cout<<mp[vv[vv.size()-1]]<<" "; } //cout<<endl; cout<<endl; continue; } puts("NO"); //cout<<endl; } }
D. AB Graph
题意:给出一张图,每条边上有一个字母a或者b,问有没有一条路长度为m组成回文串,可以由重复一条路径组成。
题解:先判断m的奇偶性,如果为奇数,一定存在,如果为偶数,看看有没有村早mp[i][j]==mp[j][i],如果有直接输出。已经判断了不存在mp[i][j] == mp[j][i],所以如果n==2那么一定是no的,然后再找mp[i][j]==mp[j][k]的i,j,k,如果存在的话那么就分m%4是否等于2输出就好了。
#include<bits/stdc++.h> #include<iostream> #include<map> #include<cstdio> #include<cmath> #define mem(a,b) memset(a,b,sizeof a) #define ll long long int using namespace std; const int maxn = 1010; char mp[1010][1010]; int main() { int t; cin>>t; while(t--) { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { scanf("%s",mp[i]+1); } if(m%2) { puts("YES"); for(int i=1;i<=m+1;i++) { cout<<i%2+1<<" "; } cout<<endl; continue; } bool flag = true; for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { if(mp[i][j] == mp[j][i]) { puts("YES"); for(int k=1;k<=m+1;k++) { if(k%2) cout<<j<<" "; else{ cout<<i<<" "; } } flag = false; break; } } if(!flag) { break; } } if(!flag ) { continue; } if(n==2) { puts("NO"); continue; } int a = -1, b = -1, c= -1; bool found = false; for(int i=1;i <=n && !found; i++) { for(int j=1; j<=n && !found; j++) { for(int k=1; k<=n && !found; k++) { if(i!=j and j!=k) { if(mp[i][j] == mp[j][k]) a=i, b=j, c=k, found=true; } } } } if(m%4==2){ vector<int> v; v.push_back(a); v.push_back(b); v.push_back(c); v.push_back(b); puts("YES"); for(int i=0;i <=m; i++) cout << v[i%v.size()] << " "; cout << endl; } else{ vector<int> v ; v.push_back(a); v.push_back(b); v.push_back(c); v.push_back(b); puts("YES"); for(int i=1;i <=m+1; i++) cout << v[i%v.size()] << " "; cout << endl; } } }