思路:直接暴力判断就OK了
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define int long long 5 6 signed main(){ 7 int _;cin>>_; 8 while(_--){ 9 string str; 10 cin>>str; 11 if(str.size()==1){ 12 if(str[0]!='?'){ 13 cout<<str<<' '; 14 }else{ 15 printf("a "); 16 } 17 continue; 18 } 19 int flag=0; 20 for(int i=0;i<str.size();i++){ 21 if(str[i]=='?'){ 22 int temp1=0;int temp2=0; 23 if(i-1>=0){ 24 if(str[i-1]=='a'){ 25 temp1=1; 26 }else if(str[i-1]=='b'){ 27 temp1=2; 28 }else if(str[i-1]=='c'){ 29 temp1=3; 30 }else{ 31 temp1=-1; 32 } 33 } 34 if(i+1<str.size()){ 35 if(str[i+1]=='a'){ 36 temp2=1; 37 }else if(str[i+1]=='b'){ 38 temp2=2; 39 }else if(str[i+1]=='c'){ 40 temp2=3; 41 }else{ 42 temp2=-1; 43 } 44 } 45 if(temp1==-1&&temp2==-1){ 46 str[i]='a'; 47 }else if(temp1==temp2){ 48 if(temp1==1){ 49 str[i]='b'; 50 }else if(temp1==2){ 51 str[i]='a'; 52 }else if(temp1==3){ 53 str[i]='a'; 54 } 55 }else{ 56 map<int,int> vis; 57 vis[temp1]=1; 58 vis[temp2]=1; 59 int F=0; 60 for(int i=1;i<=3;i++){ 61 if(!vis[i]){ 62 F=i; 63 break; 64 } 65 } 66 if(F==1){ 67 str[i]='a'; 68 }else if(F==2){ 69 str[i]='b'; 70 }else if(F==3){ 71 str[i]='c'; 72 } 73 } 74 } 75 } 76 for (int i=0;i<str.size()-1;i++){ 77 if(str[i]==str[i+1]){ 78 flag=1; 79 break; 80 } 81 } 82 if(flag){ 83 cout<<"-1"<<' '; 84 continue; 85 }else{ 86 cout<<str<<' '; 87 } 88 } 89 return 0; 90 }
思路:经过观察发现,排序后只要每个数对应的id是连续的就符合条件。
1 #include<bits/stdc++.h> 2 #include<queue> 3 using namespace std; 4 #define int long long 5 #define N 1005000 6 #define inf 0x3f3f3f3f3f3f 7 struct str{ 8 int num; 9 int id; 10 }st[N]; 11 int ans[N]; 12 bool cmp(str a,str b){ 13 return a.num<b.num; 14 } 15 deque<int> q; // 维护最小值和最大值 16 signed main(){ 17 int _; 18 cin>>_; 19 while(_--){ 20 int n; 21 cin>>n; 22 ans[1]=1; 23 ans[n]=1; 24 for(int i=1;i<=n;i++){ 25 scanf("%lld",&st[i].num); 26 st[i].id=i; 27 } 28 sort(st+1,st+1+n,cmp); 29 /* 30 for(int i=1;i<=n;i++){ 31 printf("%lld %lld ",st[i].num,st[i].id); 32 } 33 */ 34 int minx=inf; 35 int maxn=(-1)*inf; 36 minx=min(st[1].id,minx); 37 maxn=max(maxn,st[1].id); 38 for(int i=2;i<n;i++){ 39 minx=min(st[i].id,minx); 40 maxn=max(maxn,st[i].id); 41 int dis=0; 42 dis=maxn-minx+1; 43 if(i==dis){ 44 ans[i]=1; 45 }else{ 46 ans[i]=0; 47 } 48 49 } 50 for(int i=1;i<=n;i++) printf("%lld",ans[i]); 51 printf(" "); 52 for(int i=0;i<=n+1;i++){ 53 ans[i]=0; 54 st[i].id=0;st[i].num=0; 55 } 56 } 57 return 0; 58 } 59
思路:题目对于g有大小限制而s和b之间没有,则我们让g尽可能小就好了,即选解题数最高的那一组选手全部发金牌,然后发银牌,直到g>s,剩下的选手全部发铜牌,直到发的牌数恰好小于n/2即可,做不到则不可行。【模拟一下】
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define int long long 5 #define N 1050025 6 #define inf 0x3f3f3f3f3f 7 int arr[N]; 8 signed main(){ 9 int _;cin>>_; 10 while(_--){ 11 int n; 12 cin>>n; 13 int g=0,s=0,b=0; 14 for(int i=1;i<=n;i++){ 15 scanf("%lld",&arr[i]); 16 } 17 if(n<6){ 18 cout<<"0 0 0 "; 19 continue; 20 } 21 int maxn_sum=n/2; 22 int avg=maxn_sum/3; 23 int sum_g=1;int sum_s=1;int sum_b=1; 24 int now=1; 25 for(int i=1;i<=n&&i<=maxn_sum;i++,now++){ 26 if(arr[i]==arr[i+1]){ 27 sum_g++; 28 }else{ 29 break; 30 } 31 } 32 g=sum_g; 33 for(int i=now+1;i<=n&&i<=maxn_sum;i++,now++){ 34 if(sum_s<=sum_g){ 35 sum_s++; 36 }else{ 37 if(arr[i]==arr[i+1]){ 38 sum_s++; 39 }else{ 40 break; 41 } 42 } 43 } 44 s=sum_s; 45 sum_b=maxn_sum-g-s; 46 b=sum_b; 47 if(sum_b<=g){ 48 printf("0 0 0 "); 49 continue; 50 } 51 if(arr[maxn_sum]==arr[maxn_sum+1]){ 52 for(int i=maxn_sum;i>=1;i--){ 53 if(arr[i]==arr[i-1]){ 54 b--; 55 }else{ 56 b--; 57 break; 58 } 59 } 60 } 61 if(b<=g||b<=0||s<=0||g<=0||s<=g){ 62 printf("0 0 0 "); 63 continue; 64 }else{ 65 printf("%lld %lld %lld ",g,s,b); 66 } 67 68 } 69 return 0; 70 }
D题待补。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。