A. Best Subsegment

显然,选择数列中的最大值当做区间(长度为\(1\))。只要尝试最大值这个区间是否能扩展(左右两边值是否跟它一样就行了)

#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
const int N = 100010;
int n, a[N], val = -1, res = -1;
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", a + i);
val = max(val, a[i]);
}
int len = 0;
for(int i = 1; i <= n; i++){
if(a[i] == val) len ++;
else len = 0;
res = max(res, len);
}
printf("%d\n", res);
return 0;
}

B. Emotes

贪心。让总和最大,考虑可以尽量选最大的,每次选\(k\)次,然后选一个第二大的,接着选\(k\)次最大的...就这样轮替。这个过程可以用取余来快速完成,每一轮的次数是\(k + 1\)。

#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
typedef long long LL;
const int N = 200010;
int n, m, k, a[N], max1 = -1, max2 = -1;
LL res = 0;
int main(){
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= n; i++) {
scanf("%d", a + i);
if(a[i] > max1){
max2 = max1;
max1 = a[i];
}else if(a[i] > max2){
max2 = a[i];
}
}
int num = m / (k + 1), ot = m % (k + 1);
printf("%lld\n", (LL)num * k * max1 + (LL)num * max2 + (LL)ot * max1); return 0;
}

C. Magic Ship

二分答案。容易看出,时刻符合单调性。若\(d\)天能到,那么\(d + 1\)也能到。因为可以保持跟风相反的方向就可以保持不动,晚一个时刻在到。如果设置\(check\)函数,我们先把这些天风走的走完,再看现在的曼哈顿距离是否够天数走完的即可。对于二分答案的上界,可以设置为\(1e14\),最坏情况所有\(n\)次只有一次是顺方向,剩下都是逆方向,那么每\(n\)次只能动\(2\)步,结合最大需求曼哈顿是\(1e9 * 2 = 2e9\),所以最高时间就是\(n * 2e9 / 2 = 100000 * 2e9 / 2 = 1e14\)。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 100010;
typedef long long LL;
int x, y, x2, y2, n, sum[N][2];
char s[N];
//检查x时间是否可行。
bool check(LL d){
LL nx = x, ny = y;
nx += (d / n) * sum[n][0] + sum[d % n][0];
ny += (d / n) * sum[n][1] + sum[d % n][1];
return abs(x2 - nx) + abs(y2 - ny) <= d;
}
int main(){
scanf("%d%d%d%d%d%s", &x, &y, &x2, &y2, &n, s + 1);
for(int i = 1; i <= n; i++){
sum[i][1] += sum[i - 1][1] + (s[i] == 'U');
sum[i][1] -= (s[i] == 'D');
sum[i][0] -= (s[i] == 'L');
sum[i][0] += sum[i - 1][0] + (s[i] == 'R');
}
if(!check(1e14)) puts("-1");
else{
LL l = 1, r = 1e14;
while(l < r){
LL mid = (l + r) >> 1;
if(check(mid))r = mid;
else l = mid + 1;
}
printf("%lld\n", r);
} return 0;
}

D. Magic Gems

考虑\(dp\),每次有两个决策,一个是放\(m\)个普通宝石,或者放一个\(1\)个魔法宝石。

设\(f[i]\)为填i个区间的方案数,状态转移方程\(f[i] = f[i - 1] + f[i - m]\)

初始化\(f[1] = f[2] = ... = f[m - 2] = f[m - 1] = 1\)。

然后我就不会优化了...只能看题解,发现要用矩阵快速幂 or 杜教优化,但是本蒟蒻两个都不会,所以这个坑以后再填...

E. Decypher the String

我自闭了。既然可以二进制确定一个范围,那么我们尝试\(26\)进制系列,因为字母各不相同可以确定转换位置。由于\(26 ^ 2 < 10000 < 26 ^ 3\),范围之内可以解决。

询问三个分别如下:

  1. \(aaaa(26 * 26)bbbb(26 * 26)...zzzz(26 * 26)\)
  2. \(aaaa(26)bbbb(26)...zzzz(26)aaaa...\)
  3. \(abcdefghijklmn...xyzabcd...xyz...\)

这样每一步可以将答案缩小至原来的\(\frac{1}{26}\),在范围可以解决问题。

为了方便找到交集,我们用\(bitset\)即可。

PS:这毒瘤输入输出...这个它提示我输入格式不正确。

#include <cstdio>
#include <iostream>
#include <bitset>
#include <cstring>
using namespace std;
const int N = 10000;
char str[N], s[3][N], ans[N];
bitset<N> a[3][26];
int n;
int main(){
scanf("%s", str);
n = strlen(str);
for(int i = 0; i < n; i++)
for(int j = 0, t = i; j < 3; j++)
s[j][i] = t % 26 + 'a', t /= 26; for(int i = 0; i < 3; i++){
printf("? %s\n", s[i]), fflush(stdout), scanf("%d", s[i]);
} for(int i = 0; i < 3; i++)
for(int j = 0; j < n; j++)
a[i][s[i][j] - 'a'].set(i); for(int i = 0; i < n; i++){
bitset<N> u;
for(int j = 0, t = i; j < 3; j++)
u &= a[j][t % 26], t /= 26;
for(int j = 0; j < n; j++)
if(u[j]) { ans[i] = str[j]; break; }
}
printf("! %s\n", ans);
return 0;
}

然后我改成单个的就对了,wtf????

#include <cstdio>
#include <iostream>
#include <bitset>
#include <cstring>
using namespace std;
const int N = 10005;
char str[N], s1[N], s2[N], s3[N], ans[N];
bitset<N> a[3][26], now;
int n;
int main(){
scanf("%s", str);
n = strlen(str);
for (int i = 0; i< n; ++i) {
int t = i;
s1[i] = 'a' + t % 26; t /= 26;
s2[i] = 'a' + t % 26; t /= 26;
s3[i] = 'a' + t % 26; t /= 26;
}
printf("? "); puts(s1); fflush(stdout); scanf("%s", s1);
printf("? "); puts(s2); fflush(stdout); scanf("%s", s2);
printf("? "); puts(s3); fflush(stdout); scanf("%s", s3); for (int i = 0; i < n; ++i) a[0][s1[i] - 'a'].set(i);
for (int i = 0; i < n; ++i) a[1][s2[i] - 'a'].set(i);
for (int i = 0; i < n; ++i) a[2][s3[i] - 'a'].set(i); for (int i = 0; i < n; ++i) {
int t = i;
now = a[0][t % 26]; t /= 26;
now &= a[1][t % 26]; t /= 26;
now &= a[2][t % 26]; t /= 26;
for (int j = 0; j < n; ++j)
if (now[j]) { ans[i] = str[j]; break; }
}
printf("! %s\n", ans);
return 0;
}

原因应该是字符数组二维读入上和输出没有好的规定......

Codeforces Edu Round 60 A-E的更多相关文章

  1. Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...

  2. Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...

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

    Educational Codeforces Round 60 (Rated for Div. 2) 题目链接:https://codeforces.com/contest/1117 A. Best ...

  4. Codeforces Beta Round #13 C. Sequence (DP)

    题目大意 给一个数列,长度不超过 5000,每次可以将其中的一个数加 1 或者减 1,问,最少需要多少次操作,才能使得这个数列单调不降 数列中每个数为 -109-109 中的一个数 做法分析 先这样考 ...

  5. Codeforces Beta Round #80 (Div. 2 Only)【ABCD】

    Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...

  6. Codeforces Beta Round #62 题解【ABCD】

    Codeforces Beta Round #62 A Irrational problem 题意 f(x) = x mod p1 mod p2 mod p3 mod p4 问你[a,b]中有多少个数 ...

  7. Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】

    Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...

  8. CodeForces Global Round 1

    CodeForces Global Round 1 CF新的比赛呢(虽然没啥区别)!这种报名的人多的比赛涨分是真的快.... 所以就写下题解吧. A. Parity 太简单了,随便模拟一下就完了. B ...

  9. Codeforces Global Round 1 - D. Jongmah(动态规划)

    Problem   Codeforces Global Round 1 - D. Jongmah Time Limit: 3000 mSec Problem Description Input Out ...

随机推荐

  1. minishell的实现

    直接上各个模块的代码,注释都在文档代码中,非常详细,加上最后的Makefile文件完全可以自行运行看懂: main函数一个文件main.c 1 /* 2 minishell实现的功能:简单命令解析.管 ...

  2. C++调用Go方法的字符串传递问题及解决方案

    摘要:C++调用Go方法时,字符串参数的内存管理需要由Go侧进行深度值拷贝. 现象 在一个APP技术项目中,子进程按请求加载Go的ServiceModule,将需要拉起的ServiceModule信息 ...

  3. 企业网络拓扑VRRP主备功能实例(一)

    组网图形  VRRP主备备份简介 通常,同一网段内的所有主机上都存在一条相同的.以网关为下一跳的缺省路由.主机发往其他网段的报文将通过缺省路由发往网关,再由网关进行转发,从而实现主机与外部网络的通信. ...

  4. Javaer 进阶必看的 RocketMQ ,就这篇了

    每个时代,都不会亏待会学习的人. 大家好,我是 yes. 继上一篇 头条终面:写个消息中间件 ,我提到实现消息中间件的一些关键点,今天就和大家一起深入生产级别消息中间件 - RocketMQ 的内核实 ...

  5. DockerPush

    1.阿里云镜像发布流程 2.镜像生成 语法:docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]] [root@pluto data]# docker imag ...

  6. PHP一些不一样的思路

    大多数来自p牛 SQL注入(left join) 源代码 <?php $link = mysqli_connect('localhost', 'root', 'root'); mysqli_se ...

  7. OxyPlot组件的基本使用

    在制作上位机的时候,很多时候需要使用到监控绘图界面,使用来绘制曲线的组件有很多,GDI+.char.OxyPlot等等,这篇文章用来介绍OxyPlot组件的基本应用,在本文中主要是利用随心数生成函数结 ...

  8. Java中的第三大特性-多态性

    一.多态性的概念 多态性是以继承为基础上的,举个例子,人属于动物,狗也属于动物,所以动物就是父类,而人和狗都是动物的子类,都属于动物. 二.多态的使用 (1)多态一般用于方法参数或者方法返回值,特别当 ...

  9. Spring 源码阅读环境的搭建

    前言 本文记录了 Spring 源码环境的搭建方式,以及踩过的那些坑!​当前版本:5.3.2-SNAPSHOT. 环境准备 Git JDK master 分支需要 JDK 11 5.2.x 分支, J ...

  10. L - Deque 题解(区间dp)

    题目链接 题目大意 给你一个双端队列里面有n个数组元素(n<=3000) 有两个人,每次一个人都可以选择队列里的首元素或者尾元素删除,轮流进行,删除后那个人即可获得这个元素的值 第一个人的总权值 ...