博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Educational Codeforces Round 53 (Rated for Div. 2) (前五题题解)
阅读量:4598 次
发布时间:2019-06-09

本文共 4838 字,大约阅读时间需要 16 分钟。

这场比赛没有打,后来补了一下,第五题数位dp好不容易才搞出来(我太菜啊)。

比赛传送门:

 

A. Diverse Substring

 

题意:给你个字符串,让你找一个子串满足任意一个字符的个数不超过其他字符的总和,输出yes或no表示否存在,如果存在输出任意一个。

这题只要找两个不同的相邻字符,因为两个字符各一个都不超过其他字符的总和,如果字符串只由一个字符组成或长度等于一才会不存在。

 代码如下:

  

1 #include 
2 #include
3 #include
4 #include
5 #define rep(x, l, r) for(int x = (int)l; x <= (int)r; x++) 6 #define repd(x, r, l) for(int x = (int)r; x >= (int)l; x--) 7 #define clr(x,y) memset(x, y, sizeof(x)) 8 #define mp(x, y) make_pair(x, y) 9 #define all(x) begin(x), end(x)10 #define MAXN 100511 #define fi first12 #define se second;13 #define Size(x) ((int)size(x))14 using namespace std;15 typedef long long LL;16 typedef vector
vi;17 typedef pair
pii;18 const int INF = 1 << 30;19 const int p = 10000007;20 //head by DYH21 22 char st[MAXN];23 24 int main(){25 int n;26 scanf("%d", &n);27 scanf("%s", st);28 int len = strlen(st);29 char ch = st[0];30 rep(i, 1, len - 1){31 if(st[i] != ch){32 puts("YES");33 printf("%c%c\n", ch, st[i]);34 return 0;35 }36 }37 puts("NO");38 return 0;39 }
View Code Problem-A

 

B.Vasya and Books

题意:有n本书在一个栈中,依次为a1, a2, …, an,现在有n个操作,对于每个操作i,将从栈顶到书本bi的所有书全部放入包中,如果已经在包中,就不进行操作。问你每次操作需要放几本书。

这题可以记录下对于每本书i在栈中的位置posi,然后再记录上一次操作后放入包的书本数used,假如posb < used, 那么这次需要放入used - posbi 本书,否则就为0。

代码如下:

 

1 #include 
2 #include
3 #include
4 #include
5 #define rep(x, l, r) for(int x = (int)l; x <= (int)r; x++) 6 #define repd(x, r, l) for(int x = (int)r; x >= (int)l; x--) 7 #define clr(x,y) memset(x, y, sizeof(x)) 8 #define mp(x, y) make_pair(x, y) 9 #define all(x) begin(x), end(x)10 #define MAXN 20000511 #define fi first12 #define se second;13 #define Size(x) ((int)size(x))14 using namespace std;15 typedef long long LL;16 typedef vector
vi;17 typedef pair
pii;18 const int INF = 1 << 30;19 const int p = 10000007;20 //head by DYH21 22 int id[MAXN];23 24 int main(){25 int n;26 scanf("%d", &n);27 rep(i, 1, n){28 int x;29 scanf("%d", &x);30 id[x] = i;31 }32 int used = 0;33 rep(i, 1, n){34 int x;35 scanf("%d", &x);36 if(id[x] > used){37 printf("%d ", id[x] - used);38 used = id[x];39 }40 else printf("0 ");41 }42 puts("");43 return 0;44 }
View Code Problem-B

 

 

C.Vasya and Robot

题意:有一个机器人,有四种移动的操作。

  • U — move from (x,y)(x,y) to (x,y+1)(x,y+1);
  • D — move from (x,y)(x,y) to (x,y1)(x,y−1);
  • L — move from (x,y)(x,y) to (x1,y)(x−1,y);
  • R — move from (x,y)(x,y) to (x+1,y)(x+1,y).

现在有一个由操作指令组成的字符串,让你修改一些操作,使得机器人从(0, 0)走到(x, y),并且maxID - minID + 1最小,即修改最小的长度的子串。如果怎么更改都无法到达,输出-1。

这题用二分法和尺取法都可以做,也很好证明,就是在判断的时候有点麻烦。

对于每一个[l, r]的区间,最简单的方法就是现将这段区间全部删去,求出此时机器人到达的点(x2, y2)。如果进行r - l + 1次操作就能到达(x, y),即abs(x2 - x) + abs(y2 - y) <= r - l + 1,前提是同奇偶。

能否到达也无需另外判断,直接把答案的初值赋为-1即可。(然而我是一开始就判断的)

代码如下:

 

1 #include 
2 #include
3 #include
4 #include
5 #define rep(x, l, r) for(int x = (int)l; x <= (int)r; x++) 6 #define repd(x, r, l) for(int x = (int)r; x >= (int)l; x--) 7 #define clr(x,y) memset(x, y, sizeof(x)) 8 #define mp(x, y) make_pair(x, y) 9 #define all(x) begin(x), end(x)10 #define MAXN 20000511 #define fi first12 #define se second13 #define Size(x) ((int)size(x))14 using namespace std;15 typedef long long LL;16 typedef vector
vi;17 typedef pair
pii;18 const int INF = 1 << 30;19 const int p = 10000007;20 //head by DYH21 22 pii t, sum[MAXN];23 int len;24 char st[MAXN];25 26 bool judge(int l, int r){27 return abs(t.fi - (sum[len].fi - sum[r].fi + sum[l - 1].fi)) + abs(t.se - (sum[len].se - sum[r].se + sum[l - 1].se)) <= r - l + 1;28 }29 30 int main(){31 scanf("%d", &len);32 scanf("%s", st);33 rep(i, 1, len){34 if(st[i - 1] == 'U') sum[i].fi = sum[i - 1].fi, sum[i].se = sum[i - 1].se + 1;35 if(st[i - 1] == 'D') sum[i].fi = sum[i - 1].fi, sum[i].se = sum[i - 1].se - 1;36 if(st[i - 1] == 'L') sum[i].fi = sum[i - 1].fi - 1, sum[i].se = sum[i - 1].se;37 if(st[i - 1] == 'R') sum[i].fi = sum[i - 1].fi + 1, sum[i].se = sum[i - 1].se;38 }39 int x, y;40 scanf("%d%d", &x, &y);41 if(abs(x) + abs(y) > len || abs(abs(x) + abs(y) - len) & 1){42 puts("-1");43 return 0;44 }45 t = mp(x, y);46 int l = 1, r = 0, ans = INF;47 while(r <= len){48 while(judge(l, r)){49 ans = min(ans, r - l + 1);50 l++;51 }52 r++;53 }54 printf("%d\n", ans);55 return 0;56 }
View Code Problem-C

 

 

D:Berland Fair

题意:有n个摊位,在第i个摊位可以花费ai买到一个糖果。现在有一个人有m块钱,从摊位1出发,每到一个摊位如果当前的钱数大于ai,他就会买一个糖果,然后前往第i + 1个摊位(如果i == n,就到第1个摊位)。问你他会买多少颗糖果。(他会一直买直到在任何摊位都买不了糖果)

这题看上去很麻烦(也许是我太弱了,大佬勿喷),其实只要判断

 

 

 

 

noip结束,要搞文化课了……没空啊。

转载于:https://www.cnblogs.com/nblyz2003/p/9909038.html

你可能感兴趣的文章
Gradle用户指南
查看>>
iOS审核策略重磅更新:Guideline 2.1批量拒审
查看>>
给 vue项目添加ESLint
查看>>
Swift3.0 功能一(持续更新)
查看>>
HexColor
查看>>
Swift中实现点击、双击、捏、旋转、拖动、划动、长按手势的类和方法介绍
查看>>
你会用swift创建复杂的加载动画吗(1)
查看>>
javabean转换为map对象
查看>>
CSS从入门到精通2.md
查看>>
【NOIP 2013】积木大赛
查看>>
HttpWebRequest调用WebService后台需要Session信息问题的解决办法
查看>>
SQL里的子查询
查看>>
Hdu5517 Triple
查看>>
vue 调用微信支付方法
查看>>
ABP创建应用服务
查看>>
混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。...
查看>>
Swift - 绘制背景线条
查看>>
POJ 2318
查看>>
HDU 1561 树形DP背包问题
查看>>
hdu1056
查看>>