Codeforces Round #604 (Div. 2) A,B,C【D题待补】

 

 思路:直接暴力判断就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<<'\n';
14             }else{
15                 printf("a\n");
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"<<'\n';
84             continue;
85         }else{
86             cout<<str<<'\n';
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\n",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("\n");
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\n";
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\n");
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\n");
63       continue;
64     }else{
65       printf("%lld %lld %lld\n",g,s,b);
66     }
67     
68   }
69   return 0;
70 } 

D题待补。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

posted @ 2019-12-06 21:06  pengge666  阅读(126)  评论(0编辑  收藏  举报