首页 > 代码库 > Educational Codeforces Round 25

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

 

Educational Codeforces Round 25