Educational Codeforces Round 25

A题

分析:遇到1就统计有几个连续的,遇到0若连续的多于一个就输出后面的0

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 #include "vector"
 6 using namespace std;
 7 int n;
 8 string s;
 9 int main()
10 {
11     cin>>n;
12     cin>>s;
13     vector<int>p;
14     for(int i=0;i<n;){
15         if(s[i]=='0'){
16             if(i==n-1||s[i+1]=='0'){
17                 p.push_back(0);
18             }
19             i++;
20         }else{
21             int cnt=0;
22             while(i<n&&s[i]=='1'){
23                 i++;
24                 cnt++;
25             }
26             p.push_back(cnt);
27         }
28     }
29     for(int i=0;i<p.size();i++)
30         cout<<p[i];
31     cout<<endl;
32 }
View Code

B题

分析:直接对每个.位置模拟即可

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 using namespace std;
 6 const int maxn=20;
 7 string s[maxn];
 8 bool tool(int x,int y){
 9     if(x<0||x>=10||y<0||y>=10)
10         return false;
11     return true;
12 }
13 bool judge(int x,int y){
14     //横着的
15     int cnt=0;
16     int i,j;
17     i=x,j=y;
18     while(s[i][j]=='X'&&tool(i,j)){
19         i--,cnt++;
20         if(!tool(i,j)) break;
21     }
22     i=x,j=y;
23     while(s[i][j]=='X'&&tool(i,j)){
24         i++,cnt++;
25         if(!tool(i,j))  break;
26     }
27     if(cnt-1>=5)   return true;
28 
29     //竖着的
30     cnt=0;
31     i=x,j=y;
32     while(s[i][j]=='X'&&tool(i,j)){
33         j--,cnt++;
34         if(!tool(i,j))  break;
35     }
36     i=x,j=y;
37     while(s[i][j]=='X'&&tool(i,j)){
38         j++,cnt++;
39         if(!tool(i,j))  break;
40     }
41     if(cnt-1>=5)  return true;
42 
43     //主对角线
44     cnt=0;
45     i=x,j=y;
46     while(s[i][j]=='X'&&tool(i,j)){
47         i--,j--,cnt++;
48         if(!tool(i,j))  break;
49     }
50     i=x,j=y;
51     while(s[i][j]=='X'&&tool(i,j)){
52         i++,j++,cnt++;
53         if(!tool(i,j))  break;
54     }
55     if(cnt-1>=5)  return true;
56 
57     //副对角线
58     cnt=0;
59     i=x,j=y;
60     while(s[i][j]=='X'&&tool(i,j)){
61         i++,j--,cnt++;
62         if(!tool(i,j))  break;
63     }
64     i=x,j=y;
65     while(s[i][j]=='X'&&tool(i,j)){
66         i--,j++,cnt++;
67         if(!tool(i,j))  break;
68     }
69     if(cnt-1>=5)   return true;
70     return false;
71 }
72 int main()
73 {
74     for(int i=0;i<10;i++)
75         cin>>s[i];
76     int flag=0;
77     for(int i=0;i<10;i++){
78         for(int j=0;j<10;j++){
79             if(s[i][j]=='.'){
80                 s[i][j]='X';
81                 if(judge(i,j)){
82                     flag=1; break;
83                 }
84                 s[i][j]='.';
85             }
86         }
87         if(flag)  break;
88     }
89     if(flag)   cout<<"YES"<<endl;
90     else  cout<<"NO"<<endl;
91 }
View Code

C题

分析:先按照从小到大排序,在看看序列中比k大2倍的数当中有多少个后一个比前一个的2倍还多

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 #include "algorithm"
 6 using namespace std;
 7 const int maxn=1000+10;
 8 int n;
 9 long long k,a[maxn];
10 int main()
11 {
12     cin>>n>>k;
13     for(int i=0;i<n;i++){
14         cin>>a[i];
15     }
16     sort(a,a+n);
17     long long res=k;
18     int cnt=0;
19     for(int i=0;i<n;i++){
20         if(a[i]<=2*res){
21             if(a[i]>res){
22                 res=a[i];
23             }
24         }else{
25             while(2*res<a[i]){
26                 res*=2;
27                 cnt++;
28             }
29             if(a[i]>res){
30                 res=a[i];
31             }
32         }
33     }
34     cout<<cnt<<endl;
35 }
View Code

 D题

分析:首先我们二分答案,可以得出a最多可以组成多少个b,然后把?位置填上相应缺的字母,多余的填任意字母。

 1 #include "iostream"
 2 #include "cstdio"
 3 #include "cstring"
 4 #include "string"
 5 using namespace std;
 6 const int maxn=100;
 7 string a,b;
 8 int visa[maxn],visb[maxn],vis[maxn];
 9 int cnt;
10 bool judge(int x){
11     int sum=0;
12     for(int i=0;i<26;i++){
13         sum+=visb[i]*x-min(visb[i]*x,visa[i]);
14     }
15     if(sum<=cnt)
16         return true;
17     return false;
18 }
19 int main()
20 {
21     cin>>a>>b;
22     cnt=0;
23     for(int i=0;i<a.length();i++){
24         if(a[i]=='?')
25             cnt++;
26         else
27             visa[a[i]-'a']++;
28     }
29     for(int i=0;i<b.length();i++)
30         visb[b[i]-'a']++;
31     int l=0,r=a.length()/b.length()+1;
32     while(r-l>1){
33         int mid=(l+r)/2;
34         if(judge(mid))  l=mid;
35         else r=mid;
36     }
37     for(int i=0;i<26;i++){
38         vis[i]=visb[i]*l-min(visb[i]*l,visa[i]);
39     }
40     for(int i=0;i<a.length();i++){
41         if(a[i]=='?'){
42             a[i]='a';
43             for(int j=0;j<26;j++){
44                 if(vis[j]){
45                     vis[j]--;
46                     a[i]=j+'a';
47                     break;
48                 }
49             }
50         }
51     }
52     cout<<a<<endl;
53     return 0;
54 }
View Code
原文地址:https://www.cnblogs.com/wolf940509/p/7203998.html