2020.06.01——习题训练4
A - Dreamoon and Ranking Collection
大题:找到一个从1开始连续的数组。条件是在给出的数组后,再给你们k个空填补这个数组,让这个数组从1开始到k是连续得,k是最大的。
做法:使用map记录出现或者没出现,然后根据x的大小枚举出多少个没有出现的数,最后得出最大值。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=1e5+10; int main(){ int t; cin>>t; while(t--){ int n,x,maxai=-1; map<int,int> mp; cin>>n>>x; for(int i =1;i<=n;i++){ int tmp; cin>>tmp; mp[tmp]=1; } int ans; for(int i = 1;;i++){ if(mp[i]==0&&x){ x--; mp[i]=1; } //cout<<i<<endl; if(x==0&&mp[i]==0){ ans=i-1; break; } } cout<<ans<<endl; } return 0; }
题意:判断走得步数能不能只在这个四边形中。
做法:思维题,考虑全部情况就行,如果走的绝对值步数会大于绝对值半径,那必NO,再判断一下特殊情况,就是位置只有一个点的时候,也是NO,根本走不动。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=1e5+10; int main(){ int t; cin>>t; while(t--){ int a,b,c,d,x,y,x1,y1,x2,y2; cin>>a>>b>>c>>d; cin>>x>>y>>x1>>y1>>x2>>y2; if((a-b)-(x-x1)<=0&&(b-a)-(x2-x)<=0&&(c-d)-(y-y1)<=0&&(d-c)-(y2-y)<=0){ if(a&&(x-x1)==0&&(x2-x)==0) cout<<"NO"<<endl; else if(b&&(x2-x)==0&&(x-x1)==0) cout<<"NO"<<endl; else if(c&&(y-y1)==0&&(y2-y)==0) cout<<"NO"<<endl; else if(d&&(y2-y)==0&&(y-y1)==0) cout<<"NO"<<endl; else cout<<"YES"<<endl; } else cout<<"NO"<<endl; } return 0; }
题意:根据1~11个质数,对数组进行分类。
做法:直接先求出这11个质数,输入的时候进行判断是不是第一次,是第一次,颜色加1.
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=1e5+10; bool is(int n){ for(int i =2;i<=sqrt(n);i++) if(n%i==0) return false; return true; } int n,a0[1007], a[1007], ans[1007], res[1007],cnt,k; int main(){ for(int i =2;cnt<11;i++) if(is(i)) a0[++cnt]=i; cin>>k; while(k--){ cin>>n; int t=0; memset(res,0,sizeof(res)); for(int i =1;i<=n;i++){ cin>>a[i]; for(int j =1;j<=11;j++){ if(a[i]%a0[j]==0){ if(res[j]) ans[i]=res[j]; else ans[i]=res[j]=++t; break; } } } cout<<t<<endl; for(int i =1;i<=n;i++){ if(i!=1) cout<<" "; cout<<ans[i]; } cout<<"\n"; } return 0; }
题意。根据给的长度,和大小输出一个字符,包括俩b,其余都是a;
做法:很简单的排序,从右往左看,当前b在倒数第二位时,后b只有1中可能,当前b在倒数第三的时候,后b两种可能。而且是从小到大的顺序,就可以的出,这种顺序就算1+2+3+4+5+6,我们就判断一下大小在那个区间就可能的出前b的位置,后b的位置亦然。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=1e5+10; int t,n, a[1007], ans[1007], res[1007],k,sum; int main(){ cin>>t; while(t--){ cin>>n>>k; sum=0; int r; for(int i = 1;;i++){ sum+=i; r=i; if(sum>=k) break; } r=n-r; k=sum-k; for(int i =1;i<=n;i++){ if(i==r) cout<<"b"; else if(i==(r+k+1)) cout<<"b"; else cout<<"a"; } cout<<"\n"; } return 0; }
F - Carousel
题意:用最少的颜色给一个圆环边上的元素涂颜色,不相同的不能吐一样的颜色。
做法:这样最大也就3种颜色。
第一种可能是都一样,都一种颜色。第二种是数组长度为偶数,直接输出12121212……,第三种是长度为奇数,但是若,数组中间有连续的相同的元素,他们两个可以一样的颜色,然后接着12121212。第四种就是最后的元素和最开头的元素相等,只能12121212……3(第三种不成立再用)。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=2e5+10; int t,n,k,a[MAXN]; int main(){ cin>>k; while(k--){ int flag=0; cin>>n; int pos=-1; for(int i =0;i<n;i++){ cin>>a[i]; if(i!=0&&a[i]!=a[i-1]) flag=1; if(i!=0&&a[i]==a[i-1]) pos=i; } if(a[0]!=a[n-1]) flag=1; if(a[0]==a[n-1]) pos= 0; if(flag==0){ cout<<"1"<<endl; for(int i =0;i<n;i++){ if(i!=0) cout<<" "; cout<<"1"; } cout<<endl; } else if(n%2==0){ cout<<"2"<<endl; for(int i =0;i<n;i++){ if(i%2) cout<<"2"; else cout<<"1"; if(i!=n-1) cout<<" "; } cout<<endl; } else{ if(pos!=-1){ cout<<"2"<<endl; int tmp=2; for(int i=0;i<n;i++){ if(i==pos) { if(tmp==1) tmp=2; else tmp=1; } if(tmp==1) tmp=2; else tmp=1; if(i!=0) cout<<" "; cout<<tmp; } cout<<endl; } else if(flag==1){ cout<<"3"<<endl; for(int i =1;i<n;i++){ if(i%2) cout<<"1"; else cout<<"2"; cout<<" "; } cout<<"3"<<endl; } } } return 0; }

浙公网安备 33010602011771号