A. Palindromic Twist

由于必须改变。所以要使\(a[i] = a[n - i + 1]\)。

要么同向走,但必须满足之前的\(a[i] = a[n - i + 1]\)。

要么相遇,必须满足两字符相差\(2\)的距离。

#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
const int N = 110;
int n;
char str[N];
bool judge(){
for(int i = 1; i <= n / 2; i++)
if(abs(str[i] - str[n - i + 1]) != 2 && abs(str[i] - str[n - i + 1]) != 0) return false;
return true;
}
int main(){
int T; scanf("%d", &T);
while(T--){
scanf("%d%s", &n, str + 1);
if(judge()) puts("YES");
else puts("NO");
}
return 0;
}

B. Numbers on the Chessboard

找规律题,如果\(n\)是奇数,则每行有可能\((n - 1) / 2\) 或 \((n + 1) / 2\)个数字,可以分治考虑:

#include <iostream>
#include <cstdio>
#define int long long
using namespace std;
int n, q;
signed main(){
scanf("%lld%lld", &n, &q);
for(int i = 1; i <= q; i++){
int x, y; scanf("%lld%lld", &x, &y);
int num = 0;
if(n % 2){
if((x + y) % 2 == 0){
if(x % 2) num = (x - 1) * n / 2 + y / 2 + 1;
else num = (x - 2 + 1) * n / 2 + 1 + y / 2;
}else{
if(x % 2) num = n * n / 2 + 1 + (x - 1) * n / 2 + y / 2;
else num = n * n / 2 + (x - 2 + 1) * n / 2 + 1 + y / 2 + 1;
}
}else{
if((x + y) % 2 == 0){
if(x % 2) num = (x - 1) * (n / 2) + y / 2 + 1;
else num = (x - 1) * (n / 2) + y / 2;
}else{
if(x % 2) num = n * n / 2 + (x - 1) * (n / 2) + y / 2;
else num = n * n / 2 + (x - 1) * (n / 2) + y / 2 + 1;
}
}
printf("%lld\n", num); }
return 0;
}

C. Minimum Value Rectangle

设矩形的两边长为\(a\)、\(b\),且\(a <= b\),则:

\(\frac{P ^ 2}{S} = \frac{(2(a + b)) ^ 2}{a * b}= \frac{4a ^ 2 + 4b ^ 2 + 8ab }{a * b} = 4(\frac{a}{b} + \frac{b}{a}) + 8\)

使\(\frac{a}{b} + \frac{b}{a}\) 最小,只需使\(\frac{b}{a}\)最小既可,因为\(\frac{b}{a} >= 1\),但\(\frac{a}{b} <= 1\),故后者对总和没有影响。

#include <iostream>
#include <cstdio>
#include <limits.h>
#include <cstring>
#include <algorithm>
using namespace std;
const int SIZE = 10010;
int n, a, cnt[SIZE], d[SIZE << 1], tot, ansA, ansB;
double c, minn; int main(){
int T; scanf("%d", &T);
while(T--){
memset(cnt, 0, sizeof cnt);
bool success = false; tot = 0;
minn = 10001;
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", &a), cnt[a]++;
if(cnt[a] == 2) d[++tot] = a;
if(cnt[a] == 4) d[++tot] = a;
}
sort(d + 1, d + 1 + tot);
for(int i = 1; i < tot; i++){
if(d[i] == d[i + 1]){ ansA = d[i], ansB = d[i + 1]; break; }
c = (double)d[i + 1] / d[i];
if(c < minn)ansA = d[i], ansB = d[i + 1], minn = c;
}
printf("%d %d %d %d\n", ansA, ansA, ansB, ansB);
}
return 0;
}

D. Mouse Hunt

对于每个联通块,选择环中(包括子环)的一个位置设置捕鼠夹既可。

在符合条件的位置上取最小值的和即为答案。

若选择多个点,可证明其代价要大于选一个点。

若不选择绿点,选择1 + 20,但为了保证每个房间都能干掉老鼠,所以2000是必选的,所以选择联通快中多个点的花销 > 只选一个点。

#include <iostream>
#include <cstdio>
#include <vector>
#include <limits.h>
using namespace std;
const int N = 200010;
int n, c[N], a[N], ans;
bool st[N], vis[N];
vector<int> G[N], edge, val; void dfs(int u){
if(vis[u]){
val.push_back(u);
while(edge.size() && edge.back() != u)
val.push_back(edge.back()), edge.pop_back();
return ;
}
vis[u] = true, edge.push_back(u), dfs(a[u]);
}
void mark(int u){
for(int i = 0; i < G[u].size(); i++){
int v = G[u][i];
if(!st[v]) st[v] = true, mark(v);
}
}
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", c + i);
for(int i = 1; i <= n; i++) {
scanf("%d", a + i);
G[i].push_back(a[i]);
G[a[i]].push_back(i);
}
for(int i = 1 ; i <= n; i++){
if(!st[i]){
val.clear(); edge.clear();
dfs(i);
int res = INT_MAX;
for(int i = 0; i < val.size(); i++)
res = min(res, c[val[i]]);
ans += res;
st[i] = true, mark(i);
}
}
printf("%d", ans);
return 0;
}

E. Inverse Coloring

自闭,看了题解之后稍微理解了一点点。

设\(f[i][j][k]\) 为长度为\(i\), 最长连续填色数为\(k\), 尾部最长连续涂色数最长为\(j\)的方案数

可以想到,这个状态可以延展到的状态有:

  • 当新结尾颜色保持跟之前一样,\(f[i + 1][j + 1][max(j + 1, k)]\)
  • 不一样,\(f[i + 1][1][max(1, k)]\)

\(cnt[i]\) 实际上是长度为\(i\)的所有方案数,那么只要符合:

\(i * j < k\),\(cnt[i] * cnt[j]\)就能被加入答案

…...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 510, mod = 998244353;
typedef long long LL;
int n, k, f[2][N][N], cnt[N];
void update(int &a, int b){ a = (a + b) % mod; }
int main(){
scanf("%d%d", &n, &k);
f[0][0][0] = 1;
for(int i = 0; i < n; i++){
int pre = i & 1, now = pre ^ 1;
memset(f[now], 0, sizeof f[now]);
for(int j = 0; j <= n; j++){
for(int k = 0; k <= n; k++){
update(f[now][j + 1][max(j + 1, k)], f[pre][j][k]);
update(f[now][1][max(1, k)], f[pre][j][k]);
}
}
}
for(int i = 0; i <= n; i++){
for(int j = 0; j <= n; j++){
update(cnt[i], f[n & 1][j][i]);
}
}
LL ans = 0;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(i * j < k)
ans = (ans + (LL)cnt[i] * cnt[j]) % mod;
}
}
printf("%lld", (ans / 2) % mod);
return 0;
}

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

  1. Codeforces Beta Round #49 (Div. 2)

    Codeforces Beta Round #49 (Div. 2) http://codeforces.com/contest/53 A #include<bits/stdc++.h> ...

  2. Codeforces Beta Round #46 (Div. 2)

    Codeforces Beta Round #46 (Div. 2) http://codeforces.com/contest/49 A #include<bits/stdc++.h> ...

  3. CodeForce Round#49 untitled (Hdu 5339)

    Untitled Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

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

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

  5. 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]中有多少个数 ...

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

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

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

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

  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. opencv 学习1 gui属性

    1.图像 先定一个小目标学习两个个功能 1.学习怎样读入一副画像,以及如何保存一副图像 2.学习三个函数cv2.imread(), cv2.imshow() , cv2.imwrite() 1.1读入 ...

  2. 重要 | Spark分区并行度决定机制

    最近经常有小伙伴在本公众号留言,核心问题都比较类似,就是虽然接触Spark有一段时间了,但是搞不明白一个问题,为什么我从HDFS上加载不同的文件时,打印的分区数不一样,并且好像spark.defaul ...

  3. 使用日志系统graylog获取Ceph集群状态

    前言 在看集群的配置文件的时候看到ceph里面有一个graylog的输出选择,目前看到的是可以收集mon日志和clog,osd单个的日志没有看到,Elasticsearch有整套的日志收集系统,可以很 ...

  4. Nacos配置中心源码分析

    1.使用 compile 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config:2.2.3.RELEASE' spring: app ...

  5. Spark闭包 | driver & executor程序代码执行

    Spark中的闭包 闭包的作用可以理解为:函数可以访问函数外部定义的变量,但是函数内部对该变量进行的修改,在函数外是不可见的,即对函数外源变量不会产生影响. 其实,在学习Spark时,一个比较难理解的 ...

  6. Apache Flink Dashboard未授权访问导致任意Jar包上传漏洞

    漏洞危害 攻击者无需Flink Dashboard认证,通过上传恶意jar包 csdn-[漏洞复现]Apache Flink任意Jar包上传导致远程代码执行 freebuf-Apache Flink ...

  7. SHEIN:Java开发面经

    SHEIN面经 我觉得除技术外,自信是一个非常关键的点. 一面 自我介绍: 谈谈实习经历: 讲讲你实习的收获: 如何设计规范的接口?(简历上有写,所以问到) 当你需要修改两个月前的代码时,如何去整理以 ...

  8. FL Studio杂项设置页讲解(下)

    上篇文章中我们重点讲解了FL Studio中"截断/被截"如何有效的避免个采样在播放时相互干扰的知识以及电平设置栏的知识,今天我们将讲完该页面中剩下的栏目知识,一起来看看吧! 1. ...

  9. ABBYY FineReader 15高级转换功能详解

    ABBYY FineReader 15(Windows系统)OCR文字识别软件拥有强大的OCR项目功能,能帮助用户检查识别区域.验证识别出的文本.预处理图像以提高 OCR精确性等等.其强大的OCR微调 ...

  10. 如何使用OCR编辑器检查和识别文本

    ABBYY FineReader 15(Windows系统)中的OCR编辑器能帮助用户对扫描仪或者数码相机获取的图像文件进行自动文本识别,OCR区域绘制等,使这些图像文件能进一步转换为可编辑的格式.其 ...