Codeforces Round #467 (div.2)

我才不会打这种比赛呢

(其实本来打算打的)

谁叫它推迟到了\(00:05\)

我爱睡觉

题解

A. Olympiad

翻译

给你若干人的成绩

让你划定一个分数线

使得所有不低于这个分数线的人都可以获奖

但是\(0\)分的人一定不能得奖

问你有多少种获奖情况

题解

\(sort+unique\) 然后判断一下最小值是不是\(0\)就行了

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<set>
  8. #include<map>
  9. #include<vector>
  10. #include<queue>
  11. using namespace std;
  12. #define ll long long
  13. #define RG register
  14. inline int read()
  15. {
  16. RG int x=0,t=1;RG char ch=getchar();
  17. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  18. if(ch=='-')t=-1,ch=getchar();
  19. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  20. return x*t;
  21. }
  22. int n,a[500];
  23. int main()
  24. {
  25. n=read();
  26. for(int i=1;i<=n;++i)a[i]=read();
  27. sort(&a[1],&a[n+1]);
  28. int tot=unique(&a[1],&a[n+1])-a-1;
  29. if(a[1]==0)tot--;
  30. printf("%d\n",tot);
  31. return 0;
  32. }

B. Vile Grasshoppers

翻译

给定\(p,y\)

在\(2..y\)内找到一个最大值\(x\)

使得\(x\)不能被\(2..p\)整除

无解输出\(-1\)

题解

看到范围这么大。

真是吓死人

首先考虑一下怎么检查一个值\(x\)是否可行

当然不需要枚举\(2..p\)

最多只需要枚举到\(\sqrt x\)

如果有解,要么\(p\)很小,要么\(y\)很大

很容易就可以枚举出来

如果无解,\(p\)一定要很接近\(y\)

这样不需要枚举多少个数

复杂度\(O(???)\)

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<set>
  8. #include<map>
  9. #include<vector>
  10. #include<queue>
  11. using namespace std;
  12. #define ll long long
  13. #define RG register
  14. ll ans=0;
  15. int main()
  16. {
  17. int p,y;
  18. cin>>p>>y;
  19. for(int ans=y;ans>p;--ans)
  20. {
  21. bool fl=true;
  22. for(int i=2;i<=p&&i*i<=ans;++i)
  23. if(ans%i==0){fl=false;break;}
  24. if(fl){cout<<ans<<endl;return 0;}
  25. }
  26. puts("-1");
  27. return 0;
  28. }

C. Save Energy!

翻译

有一个人要煮鸡吃

但是炉子每过\(k\)分钟就会自动关上

这个人每过\(d\)分钟会进厨房,如果炉子关上了他就会打开

炉子在打开的时候鸡只需要\(t\)分钟就可以煮熟

在关上的时候则需要\(2t\)分钟

问这个人多久以后可以吃到鸡

题解

这题很简单啊

首先如果\(K\%d=0\)就不用考虑了

否则我们一定能够找到一个最小的\(x\)

使得\(xd>K\)

这样子的话,我们发现开关状态以\(xd\)循环

接下来只要分类讨论就行了

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<set>
  8. #include<map>
  9. #include<vector>
  10. #include<queue>
  11. using namespace std;
  12. #define ll long long
  13. #define RG register
  14. ll K,d,t;
  15. int main()
  16. {
  17. cin>>K>>d>>t;t*=2;
  18. if(K%d==0){cout<<t/2<<endl;return 0;}
  19. ll st=K/d+1;
  20. ll T=st*d;
  21. ll ts=2*K+(T-K);
  22. double ans=t/ts*T;t%=ts;
  23. if(t<=2*K)ans+=t/2.0;
  24. else
  25. {
  26. ans+=K;
  27. t-=2*K;
  28. ans+=t;
  29. }
  30. printf("%.10lf\n",ans);
  31. return 0;
  32. }

D. Sleepy Game

翻译

有两个人在玩一个游戏

有一个棋子和有向图

一开始棋子在某个位置

然后两个人轮流走

谁先走不了谁就输了

如果超过了\(10^6\)步则平局

但是现在第二个人睡觉去了

两个人都由第一个人操控

问第一个人能不能赢,如果能输出路径

否则输出平局或者必败

题解

首先考虑能不能赢

因为能不能赢

只和到达一个出度为\(0\)的点的路径的奇偶性有关

所以用一个\(BFS\)检查能否以某个奇偶性到达某个点

如果有出度为\(0\)的点满足条件,则输出路径

考虑平局,即能够到达某个环

第一步检查了能否到达

这样找到环以后判断一下就好

如果也不能平局,则必败,输出即可

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<set>
  8. #include<map>
  9. #include<vector>
  10. #include<queue>
  11. using namespace std;
  12. #define ll long long
  13. #define RG register
  14. #define MAX 120000
  15. inline int read()
  16. {
  17. RG int x=0,t=1;RG char ch=getchar();
  18. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  19. if(ch=='-')t=-1,ch=getchar();
  20. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  21. return x*t;
  22. }
  23. struct Line{int v,next;}e[MAX*2];
  24. int h[MAX],cnt=1,n,m,H[MAX],B;
  25. int dis[MAX][2],zy[MAX][2];
  26. inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
  27. void outp(int now,int k,int w)
  28. {
  29. if(!(k==now&&!w))outp(now,zy[k][w],w^1);
  30. printf("%d ",k);
  31. }
  32. bool bfs(int now)
  33. {
  34. queue<pair<int,int> >Q;
  35. Q.push(make_pair(now,0));
  36. dis[now][0]=1;
  37. while(!Q.empty())
  38. {
  39. int u=Q.front().first,w=Q.front().second;Q.pop();
  40. for(int i=h[u];i;i=e[i].next)
  41. {
  42. int v=e[i].v;
  43. if(dis[v][w^1])continue;
  44. zy[v][w^1]=u;
  45. dis[v][w^1]=1;
  46. Q.push(make_pair(v,w^1));
  47. }
  48. }
  49. for(int i=1;i<=n;++i)
  50. if(!H[i]&&dis[i][1])
  51. {
  52. puts("Win");outp(now,i,1);puts("");
  53. return true;
  54. }
  55. return false;
  56. }
  57. int dfn[MAX],low[MAX],tim;
  58. int S[MAX],top,G[MAX];
  59. bool vis[MAX];
  60. bool Ans;
  61. void Tarjan(int u)
  62. {
  63. S[++top]=u;vis[u]=true;
  64. dfn[u]=low[u]=++tim;
  65. for(int i=h[u];i;i=e[i].next)
  66. {
  67. int v=e[i].v;
  68. if(!dfn[v])Tarjan(v),low[u]=min(low[u],low[v]);
  69. else if(vis[v])low[u]=min(low[u],dfn[v]);
  70. }
  71. if(dfn[u]==low[u])
  72. {
  73. int v,size=0;
  74. do{v=S[top--];vis[v]=false;G[++size]=v;}while(u!=v);
  75. if(size!=1)
  76. for(int i=1;i<=size;++i)
  77. if(dis[G[i]][0]||dis[G[i]][1])Ans=true;
  78. }
  79. }
  80. int main()
  81. {
  82. n=read();m=read();
  83. for(int i=1;i<=n;++i)
  84. {
  85. H[i]=read();
  86. for(int j=1;j<=H[i];++j)Add(i,read());
  87. }
  88. B=read();
  89. if(bfs(B))return 0;
  90. for(int i=1;i<=n;++i)if(!dfn[i])Tarjan(i);
  91. if(Ans)puts("Draw");
  92. else puts("Lose");
  93. return 0;
  94. }

E. Lock Puzzle

翻译

给定一个串\(s\)和目标串\(s'\)

你每次都可以执行一个\(shift\)操作

执行\(shift(x)\)后

假设原来的串是\(s=AB\)

那么,现在的串变为了\(B^RA\)

其中,\(B\)的长度等于\(x\)

说白点,就是把后\(x\)个字符翻转后,放在字符串的最前面

(举个例子,原来是\(ababc\) ,执行\(shift(3)\)后,变为了\(cbaab\))

执行操作的次数不能超过\(6100\)次

无解输出\(-1\)

题解

我们假设前面已经匹配好了\(i-1\)位

现在匹配第\(j\)位

那么,现在当前串中找到一个和目标位置相同的字符,位置是\(pos\)

然后考虑\(shift\)操作

当然,只需要执行\(shift(n-pos),shift(1),shift(n)\)三次操作就行了

我们假设当前串是\(AcB\)其中\(c=s[pos]\)

\(shift(n-pos)\)之后\(B^RAc\)

\(shift(1)\)之后\(cB^RA\)

\(shift(n)\)之后\(A^RBc\)

这样的话,我们发现后面的位置就不会再变化了

而每次我们都把当前的目标字符给挪到了最后一个位置

这样执行\(3n\)次操作之后就可以得到目标串了

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<set>
  8. #include<map>
  9. #include<vector>
  10. #include<queue>
  11. using namespace std;
  12. #define ll long long
  13. #define RG register
  14. #define MAX 5000
  15. int n,a[26],b[26];
  16. char s[MAX],ss[MAX];
  17. char s1[MAX],s2[MAX];
  18. vector<int> ans;
  19. void shift(char *s,int x)
  20. {
  21. int t1=0,t2=0;
  22. for(int i=n-x+1;i<=n;++i)s2[++t2]=s[i];
  23. reverse(&s2[1],&s2[t2+1]);
  24. for(int i=1;i<=n-x;++i)s1[++t1]=s[i];
  25. for(int i=1;i<=x;++i)s[i]=s2[i];
  26. for(int i=1;i<=t1;++i)s[i+t2]=s1[i];
  27. ans.push_back(x);
  28. }
  29. int main()
  30. {
  31. scanf("%d",&n);
  32. scanf("%s",s+1);
  33. scanf("%s",ss+1);
  34. for(int i=1;i<=n;++i)a[s[i]-97]++,b[ss[i]-97]++;
  35. for(int i=0;i<26;++i)if(a[i]!=b[i]){puts("-1");return 0;}
  36. for(int i=1;i<=n;++i)
  37. {
  38. int pos;
  39. for(int j=1;j<=n;++j)
  40. if(s[j]==ss[i]){pos=j;break;}
  41. shift(s,n-pos);shift(s,1);shift(s,n);
  42. }
  43. printf("%d\n",(int)(ans.size()));
  44. for(int i=0;i<ans.size();++i)
  45. printf("%d ",ans[i]);
  46. return 0;
  47. }

Codeforces Round #467 (div.2)的更多相关文章

  1. Codeforces Round #467 (Div. 2) B. Vile Grasshoppers

    2018-03-03 http://codeforces.com/problemset/problem/937/B B. Vile Grasshoppers time limit per test 1 ...

  2. Codeforces Round #467 (Div. 1) B. Sleepy Game

    我一开始把题目看错了 我以为是博弈.. 这题就是一个简单的判环+dfs(不简单,挺烦的一题) #include <algorithm> #include <cstdio> #i ...

  3. Codeforces Round #467 (Div. 1). C - Lock Puzzle

    #include <algorithm> #include <cstdio> #include <cstring> #include <iostream> ...

  4. Codeforces Round #467 Div. 1

    B:显然即相当于能否找一条有长度为奇数的路径使得终点出度为0.如果没有环直接dp即可.有环的话可以考虑死了的spfa,由于每个点我们至多只需要让其入队两次,复杂度变成了优秀的O(kE).事实上就是拆点 ...

  5. Codeforces Round #467 (Div. 2) E -Lock Puzzle

    Lock Puzzle 题目大意:给你两个字符串一个s,一个t,长度<=2000,要求你进行小于等于6100次的shift操作,将s变成t, shift(x)表示将字符串的最后x个字符翻转后放到 ...

  6. Codeforces Round #467 (Div. 2) B. Vile Grasshoppers[求去掉2-y中所有2-p的数的倍数后剩下的最大值]

    B. Vile Grasshoppers time limit per test 1 second memory limit per test 256 megabytes input standard ...

  7. Codeforces Round #467 (Div. 2) A. Olympiad[输入一组数,求该数列合法的子集个数]

    A. Olympiad time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...

  8. Codeforces Round #467 Div.2题解

    A. Olympiad time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...

  9. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

随机推荐

  1. 移动web页面给用户发送邮件的方法

    微信商户通有这么一个需求,用户打开H5页面后,引导用户到电脑下载设计资源包,由于各种内部原因,被告知无后台资源支持,自己折腾了一段时间找了下面2个办法,简单做下笔记. 使用mailto功能,让用户自己 ...

  2. Java导出freemarker实现下载word文档格式功能

    首先呢,先说一下制作freemarker模板步骤, 1. 在WPS上写出所要的下载的word格式当做模板 2. 把模板内不固定的内容(例:从数据库读取的信息)写成123或者好代替的文字标注 3. 把固 ...

  3. 关于eclipse安装springide的记录

    近些天,又开始学习springmvc,使用eclipse进行开发,由于很多快捷键时候需要安装springide插件才能出来,我遇到配置DispatcherServlet,结果alt+/出不来Dispa ...

  4. js内存泄露的原因

    1.意外的全局变量 function fun(){ a=19//全局变量 console.log(a) } 2.未及时清理计时器或者回调函数 //记得及时清理定时器 var intervalId=se ...

  5. MYSQL索引的类型和索引的方式

    索引的类型: normal:表示普通索引 unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique full textl: 表示 全文搜索的索 ...

  6. 剑指offer面试题-Java版-持续更新

    最近在用Java刷剑指offer(第二版)的面试题.书中原题的代码采用C++编写,有些题的初衷是为了考察C++的指针.模板等特性,这些题使用Java编写有些不合适.但多数题还是考察通用的算法.数据结构 ...

  7. mysql 学习心得1

    1由于不靠这玩意吃饭 估计不准备精读 顺便中文版也不用担心翻译问题 科科 大致翻了下=,= mysql的感觉怎么就是背命令.... 2DDL语句 定义数据 创建删除修改 create drop alt ...

  8. 长整形的使用及cin加速

    _int64 和 long long 那么对ACMer来说,最为关心的就是在各个OJ上交题应分别使用哪种方式了.其实方式只有有限的几种: 如果服务器是linux系统,那么定义用long long,IO ...

  9. pycharm安装,svn使用,远程开发调试,接口测试,连接服务器

    磨刀不误砍柴工,配置完美的编辑器,在开发时,能帮助我们节约大量的时间成本,从而是我们的精力放在业务逻辑实现上面! 接下来将介绍 使用pyhcarm如何使用svn,远程开发调试,接口测试,已经连接远程服 ...

  10. Dropout

    参数正则化方法 - Dropout 受人类繁衍后代时男女各一半基因进行组合产生下一代的启发,论文(paper.pdf)提出了Dropout. Dropout是一种在深度学习环境中应用的正规化手段.它是 ...