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 }

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 }

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 }

时间: 2024-10-13 16:48:21

Educational Codeforces Round 25的相关文章

Educational Codeforces Round 25 F. String Compression(kmp+dp)

题目链接:Educational Codeforces Round 25 F. String Compression 题意: 给你一个字符串,让你压缩,问压缩后最小的长度是多少. 压缩的形式为x(...)x(...)  x表示(...)这个出现的次数. 题解: 考虑dp[i]表示前i个字符压缩后的最小长度. 转移方程解释看代码,这里要用到kmp来找最小的循环节. 当然还有一种找循环节的方式就是预处理lcp,然后通过枚举循环节的方式. 这里我用的kmp找的循环节.复杂度严格n2. 1 #inclu

Educational Codeforces Round 25 G. Tree Queries

题目链接:Educational Codeforces Round 25 G. Tree Queries 题意: 给你一棵树,一开始所有的点全是黑色,有两种操作. 1 x 将x这个点变为黑色,保证第一个操作是这个. 2 x 询问x到任意黑色的点的简单路径上的最小节点编号. 题解: 首先将一个变为黑色的点当成树根,然后dfs一下,预处理出所有点的答案. 然后开一个变量记录一下当前变黑的点的答案cur=min(cur,dp[x]). 每次询问的时候答案就是min(cur,dp[x]). 如果觉得很神

Educational Codeforces Round 25 D - Suitable Replacement(贪心)

题目大意:给你字符串s,和t,字符串s中的'?'可以用字符串t中的字符代替,要求使得最后得到的字符串s(可以将s中的字符位置两两交换,任意位置任意次数)中含有的子串t最多. 解题思路: 因为知道s中的字符位置可以交换无数次,所以只要s中含有可以组成t的字符就一定可以出现子串t.所以就是要令t中的字符数量尽量平均地分布在s中. 代码: 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int str[30

Educational Codeforces Round 21 G. Anthem of Berland(dp+kmp)

题目链接:Educational Codeforces Round 21 G. Anthem of Berland 题意: 给你两个字符串,第一个字符串包含问号,问号可以变成任意字符串. 问你第一个字符串最多包含多少个第二个字符串. 题解: 考虑dp[i][j],表示当前考虑到第一个串的第i位,已经匹配到第二个字符串的第j位. 这样的话复杂度为26*n*m*O(fail). fail可以用kmp进行预处理,将26个字母全部处理出来,这样复杂度就变成了26*n*m. 状态转移看代码(就是一个kmp

Educational Codeforces Round 26 D. Round Subset(dp)

题目链接:Educational Codeforces Round 26 D. Round Subset 题意: 给你n个数,让你选其中的k个数,使得这k个数的乘积的末尾的0的个数最大. 题解: 显然,末尾乘积0的个数和因子2和因子5的个数有关. 然后考虑dp[i][j]表示选i个数,当前因子5的个数为j时,能得到因子2最多的为多少. 那么对于每个数,记录一下因子2和5的个数,做一些01背包就行了. 1 #include<bits/stdc++.h> 2 #define mst(a,b) me

Educational Codeforces Round 23 F. MEX Queries(线段树)

题目链接:Educational Codeforces Round 23 F. MEX Queries 题意: 一共有n个操作. 1.  将[l,r]区间的数标记为1. 2.  将[l,r]区间的数标记为0. 3.  将[l,r]区间取反. 对每个操作,输出标记为0的最小正整数. 题解: hash后,用线段树xjb标记一下就行了. 1 #include<bits/stdc++.h> 2 #define ls l,m,rt<<1 3 #define rs m+1,r,rt<&l

Educational Codeforces Round 23 D. Imbalanced Array(单调栈)

题目链接:Educational Codeforces Round 23 D. Imbalanced Array 题意: 给你n个数,定义一个区间的不平衡因子为该区间最大值-最小值. 然后问你这n个数所有的区间的不平衡因子和 题解: 对每一个数算贡献,a[i]的贡献为 当a[i]为最大值时的 a[i]*(i-l+1)*(r-i+1) - 当a[i]为最小值时的a[i]*(i-l+1)*(r-i+1). 计算a[i]的l和r时,用单调栈维护.具体看代码,模拟一下就知道了. 然后把所有的贡献加起来.

Educational Codeforces Round 23 E. Choosing The Commander (trie)

题目链接: Educational Codeforces Round 23 E. Choosing The Commander 题意: 一共有n个操作. 1.  插入一个数p 2.  删除一个数p 3.  询问有多少个数 使得 x^p<l 题解: 对于前两种操作用01trie就能解决. 对于对三个操作,我们考虑在trie上搜索. 1.  当l的bit位是1时,那边bit位是p的字数全部的数都会小于l,(因为p^p=0) 2.  当l的bit为是0时,那边只能向bit位是p的子树中搜. 这样算下来

Educational Codeforces Round 22 E. Army Creation(主席树)

题目链接:Educational Codeforces Round 22 E. Army Creation 题意: 给你n个数和一个数k,然后有q个询问. 每个询问 有一个区间[l,r],问你这个区间内在满足每一种数不超过k的情况下,最大能选多少个数出来. 强制在线. 题解: 一看就要用到主席树,和主席数求区间内有多少不同的数的个数处理方法相同. 依次将每个数插入,当这个数出现的个数等于k了,就把最前面的那个数删掉. 然后询问就访问root[r]就行了. 第一次写完数据结构没有调试一遍过样例,一