rated

Codeforces Edu Round 82 (Rated for Div. 2)

帅比萌擦擦* 提交于 2020-02-13 12:57:29
题目链接: https://codeforces.com/contest/1303 A: 白给 1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou double 6 #define pb emplace_back 7 #define mp make_pair 8 #define sot(a,b) sort(a+1,a+1+b) 9 #define rep1(i,a,b) for(int i=a;i<=b;++i) 10 #define rep0(i,a,b) for(int i=a;i<b;++i) 11 #define eps 1e-8 12 #define int_inf 0x3f3f3f3f 13 #define ll_inf 0x7f7f7f7f7f7f7f7f 14 #define lson (curpos<<1) 15 #define rson (curpos<<1|1) 16 /* namespace */ 17 using namespace std; 18 /* header end */ 19 20 const int maxn = 110; 21 int t; 22 char s[maxn]; 23 24 int

Educational Codeforces Round 82 (Rated for Div. 2)

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-13 12:23:17
A 1必须和1相邻,把所有1和1之间的0去掉即可,就是统计1和1之间有多少个0 #include <iostream> #include <cstdio> #include <vector> int main(){ int T; read(T); while(T--){ char s[105]; cin >> s; int len = strlen(s); std::vector<int> v; for(int i = 0; i < len; i++){ if(s[i] == '1')v.push_back(i); } int ans = 0; for(int i = 1; i < v.size(); i++){ ans += v[i] - v[i - 1] - 1; } printf("%d\n",ans); } return 0; } B 好的天数是 \(x = \lceil\frac{n}{2}\rceil\) ,那么优先考虑x x天需要 \(\lceil\frac{x}{g}\rceil\) 个g天去完成,但是最后一个g天不一定用完,比如n = 10,g = 2,需要 2,2,1去完成 那么 \((\lceil\frac{x}{g}\rceil - 1) * (g + b) + x - (\lceil\frac{x}{g}\rceil - 1) * g = x + (

Educational Codeforces Round 82 (Rated for Div. 2)

心不动则不痛 提交于 2020-02-13 08:11:20
题目链接: https://codeforces.com/contest/1303 E - Erase Subsequences 题意:从一个长度为 \(n(1\leq n \leq 400)\) 的字符串 \(s\) 中,进行至多两次操作,问是否能构造出长度为 \(m(1\leq m\leq 400)\) 的字符串 \(t\) 。每次操作,从字符串 \(s\) 中取出一个子序列,接在当前字符串 \(p\) 的后面,初始时, \(p\) 为空串。同一个字符不能被取出2次。 题解:一开始搞了个贪心,结果连第一个样例都过不了,其实看复杂度就知道过不了了。看一下性质(无后效性)其实很容易想到一种 \(dp\) 的算法,但是只想到一个 \(O(n^4)\) 的dp,先枚举字符串 \(t\) 的前半部分和后半部分的分界线,然后用一个 \(dp[i][j][k]\) 表示字符串 \(s\) 的前 \(i\) 个字符是否可以匹配前半的字符串 \(t\) 的前 \(j\) 个字符以及字符串 \(t\) 的后半的前 \(k\) 个字符。这个算法不高效的原因很可能是因为lyd说的“没有把状态压缩到极致”,很明显每个 \(dp\) 只是布尔值的话可以用一些什么bitset优化。别人的正解其实多压缩了一维,也改变了实际上设计的状态,用 \(dp[i][j]\) 表示字符串 \(s\) 的前 \(i\)

Educational Codeforces Round 65 (Rated for Div. 2)

倖福魔咒の 提交于 2020-02-11 05:22:58
题目大意:给定你t个长度为N的字符串,问你能否通过删除字符串得到长度为11位且首位位8的电话号码。 思路:若N<11直接输出NO,N>=11 则枚举前 0 - (N-11)位,若其中有8出现则输出YES,否则是NO。 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<queue> 6 #include<vector> 7 #include<cmath> 8 #include<map> 9 #include<set> 10 using namespace std; 11 typedef long long LL; 12 const int maxn = 1e5+10; 13 LL n,t; 14 string str; 15 int main() 16 { 17 cin>>t; 18 while(t--){ 19 cin>>n; 20 cin>>str; 21 string ans = "NO"; 22 for(int i=0;i<n-10;i++){ 23 if(str[i]=='8'){ 24 ans = "YES"; 25 break; 26 } 27 } 28 cout<<ans<<endl; 29 } 30 return 0; 31 }

Educational Codeforces Round 57 (Rated for Div. 2) C 正多边形 + 枚举

安稳与你 提交于 2020-02-11 03:54:00
https://codeforces.com/contest/1096/problem/C 题意 问是否存在一正多边形内三点构成的角度数为ang,若存在输出最小边数 题解 三点构成的角是个圆周角,假设n为多边形边数,则能构成的角范围是 \(\frac{180}{n} \leq ang \leq \frac{n-2}{n}*180\) ,每次变化 \(\frac{180}{n}\) 首先明确正多边形一定存在,并且最大边数不会超过360,若边数等于360,则可以组成的角的范围是 \(0.5\leq ang \leq 179\) ,每次变化 \(0.5\) ,所以所有的ang都能组成 所以枚举边数,然后再枚举使用的内角数即可 代码 #include<bits/stdc++.h> using namespace std; int t,ang,i,st,tp,ok; int main(){ cin>>t; while(t--){ ok=0; cin>>ang; for(int i=1;i<=180;i++){ for(int j=1;j*180.0/i<=ang&&j<=i-2;j++){ if(j*180.0/i==ang){ cout<<i<<endl; ok=1; break; } } if(ok)break; } if(!ok)cout<<360<<endl; } } 来源:

Educational Codeforces Round 63 (Rated for Div. 2) E 带模高斯消元

不想你离开。 提交于 2020-02-11 03:46:46
https://codeforces.com/contest/1155/problem/E 题意 \(f(x)=a_0+a_1x+a_2x^2+...+a_kx^k,k \leq 10,0 \leq a_i < 10^6+3\) ,每次可以询问一个x,返回 \(f(x)mod(10^6+3)\) ,50次询问以内需要找到x使得 \(f(x) \equiv 0 mod(10^6+3)\) 题解 现未知 \(a_0,a_1,...,a_k\) ,一共k+1个未知数,需要k+1个方程来解,因此只需要询问k+1次即可 将x看成系数, \(a_0,a_1,...,a_k\) 当成未知数,带模高斯消元即可 代码 #include<bits/stdc++.h> #define ll long long using namespace std; const ll P=1e6+3; ll a[15][15],b[15]; int ask(int i){ printf("? %d\n",i); fflush(stdout); int x;scanf("%d",&x); return x; } ll inv(ll bs){ ll ans=1,x=P-2; while(x){ if(x&1)ans=ans*bs%P; bs=bs*bs%P; x>>=1; } return ans; } void gao(

Educational Codeforces Round 81 (Rated for Div. 2) 题解

强颜欢笑 提交于 2020-02-10 18:31:29
过了n天补的题解:D AB就不用说了 C. Obtain The String 思路挺简单的,就是贪心,但是直接贪心的复杂度是O(|s|*|t|),会超时,所以需要用到序列自动机 虽然名字很高端但是就是个数组啦(不过我自己想不到就是了) next[i][j]表示i之后第一次出现j字符的位置,用这个函数就可以把复杂度降到O(|t|) #include <cstdio> #include <cstring> using namespace std; const int N = 100010; char s[N], t[N]; bool flag[30]; int next[N][30]; int main() { int cs; scanf("%d", &cs); while (cs--) { scanf("%s", s); scanf("%s", t); int len1 = strlen(t); int len2 = strlen(s); int l = 0, cnt = 1; memset(next, 0xff, sizeof(next)); for (int i = len2 - 1; i >= 0; i--) { for (int j = 0; j < 26; j++) next[i][j] = next[i + 1][j]; next[i][s[i] - 'a'] = i;

Educational Codeforces Round 75 (Rated for Div. 2) D

五迷三道 提交于 2020-02-10 17:43:13
题意 n n n 个区间,从每个区间取一个数,要求最后中位数尽可能大 题意 第一反应就是二分 但是我,二分单调性的理解,很差 我就否决了,去想枚举,然后我就没了。 实际上就是二分中位数,对于一个中位数,肯定有一部分在你左边,一部分在你右边。 如果左边部分超过一半了,说明这个中位数过大了。 如果右边部分超过一半了,说明这个中位数过小了。 如果正常情况下,剩下的只剩 l ≤ m i d ≤ r l\leq mid \leq r l ≤ m i d ≤ r 的区间了,这个时候就先取最小的左端点使得左边的取满一半,然后使右边取满一半+1,右边的贡献就是中位数大小 如果这个和比 s s s 小,说明符合情况,再取更大的中位数。 反之,不符合情况,取更小的中位数。 在保证左右两边都不超过的情况,你如何证明单调性呢? 首先贡献肯定是绝大部分取左端点,少部分取中位数。 大概是这样: a l r b a \quad \quad l \quad r \quad \quad b a l r b a a a 、 b b b 保证在左边和右边的部分,首先他们不会超限,并且他们一定取左端点。 l l l 、 r r r 部分就是包含中位数的部分,左边一部分取左端点,右边取中位数。 所以对原区间排序,前一半一定取左端点。 我们考虑增大中位数,显然如果先决条件成立,随着中位数增大,能够选择的区间会越多

Educational Codeforces Round 39 (Rated for Div. 2)

狂风中的少年 提交于 2020-02-10 05:21:57
这场终于打了 B题一个地方忘开longlong,找了半天 C题没看公告被Hack D题分析后发现是背包dp,但没写出来,菜啊 A、B、C 签到 D. Timetable 分组背包 题意 给n天,每天有m节课,0代表这节课没有,1代表有,每天都必须从第一节课来,上完最后一节课才能走,现可以逃k节课,问最少待在学校的时间 分析 不难看出,逃的课一定是从某一天的开始或者结束,这样才是最优的,所以我们可以预处理出每天逃课数量与最小待在学校时间的关系 然后一个背包dp就ok了 trick:dp边界处理一定要注意细节,设置的一定要合理到位 总结 思路是先想到dp原型和方程,然后去考虑边界细节 #include<bits/stdc++.h> #define ll long long #define pb push_back using namespace std; const int maxn = 607; int n, m, k; int dp[maxn][maxn]; int ans[maxn][maxn]; string s[maxn]; vector<int>p[maxn]; int h[maxn]; int main() { scanf("%d%d%d", &n, &m, &k); for(int i=1;i<=n;i++) cin>>s[i]; for(int i=1;i<=n;i+

Educational Codeforces Round 57 (Rated for Div. 2) ABCDEF题解

∥☆過路亽.° 提交于 2020-02-10 04:49:49
题目总链接: https://codeforces.com/contest/1096 A. Find Divisible 题意: 给出l,r,在[l,r]里面找两个数x,y,使得y%x==0,保证有解。 题解: 直接输出l,2*l就好啦,但我还是写了个循环... 代码如下: #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 10; int T; ll l,r; int main(){ cin>>T; while(T--){ scanf("%I64d%I64d",&l,&r); for(ll i=l;i<=r;i++){ if(i*2<=r){ printf("%I64d %I64d\n",i,2*i); break ; } } } return 0; } View Code B. Substring Removal 题意: 给出一个字符串,现在要你删掉一个子串,使得剩下的串有不多于一个的字符。 题解: 从两端找连续的相同字符串并且统计个数,然后算算就可以了。 注意一下所有字符串都相等的情况。 还有一种情况就是两段连续的字符串字符都相等,那么这时就可以删掉中间的,这个个数也比较好统计。 具体见代码(注意中间计算过程不要爆int): #include <bits/stdc+