标签:size cin 中间 ems break cout tin def map
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; } }
Codeforces Round #699 (Div. 2)
标签:size cin 中间 ems break cout tin def map
原文地址:https://www.cnblogs.com/lcsdsg/p/14380738.html