比赛链接:https://codeforces.com/contest/1447

A. Add Candies

题意

\(1\) 到 \(n\) 个袋子里依次有 \(1\) 到 \(n\) 个糖果,可以选择操作 \(m\) 次,第 \(i\) 次操作可以:

  • 选择一个袋子,除了这个袋子外其他袋子都再放入 \(i\) 个糖果

问是否存在一种操作序列,使得最终 \(n\) 个袋子内的糖果数相同。

题解

将每个袋子内的糖果都加到 \(\frac{n(n + 1)}{2}\) 个。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
cout << n << "\n";
for (int i = 1; i <= n; i++) cout << i << " \n"[i == n];
}
return 0;
}

B. Numbers Box

题意

给出一个 \(n \times m\) 的矩阵,每次操作可以:

  • 选择任意两个相邻元素各乘以 \(-1\)

可以操作任意次,问矩阵中所有元素之和的最大值为多少。

题解

有零的话可以把所有负数都变为正,答案即所有数的绝对值之和。

否则如果负数个数为奇数,需要减去一个绝对值最小的数。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
int n, m;
cin >> n >> m;
vector<int> a(n * m);
int sum = 0, neg = 0, zero = 0, mi = INT_MAX;
for (auto &x : a) cin >> x, sum += abs(x), neg += x < 0, zero += x == 0, mi = min(mi, abs(x));
if (neg & 1 and zero == 0) sum -= 2 * mi;
cout << sum << "\n";
}
return 0;
}

C. Knapsack

题意

有一个承重为 \(W\) 的背包,另有 \(n\) 个物品,分别重 \(w_i\) ,判断能否找到一些物品使得它们的总重 \(C\) 满足 \(\lceil \frac{W}{2} \rceil \le C \le W\) ,如果可以,输出这些物品的编号。

题解

首先去除 \(w_i > W\) 的元素,然后如果有单个 \(w_i \ge \lceil \frac{W}{2} \rceil\) 直接选取即可,此时余下的 \(w_i\) 均小于 \(\lceil \frac{W}{2} \rceil\) ,如果它们的总和小于 \(\lceil \frac{W}{2} \rceil\) 则无解,否则一定存在满足题意的序列,依次选取至不小于 \(\lceil \frac{W}{2} \rceil\) 即可。

证明

两个小于 \(\lceil \frac{W}{2} \rceil\) 的数相加有两种情况:

  • 小于 \(\lceil \frac{W}{2} \rceil\)
  • 不小于 \(\lceil \frac{W}{2} \rceil\) 且小于 \(W\)

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
long long n, W;
cin >> n >> W;
long long mid_W = (W + 1) / 2;
vector<int> w(n);
for (auto &x : w) cin >> x;
vector<int> p(n);
iota(p.begin(), p.end(), 0);
sort(p.begin(), p.end(), [&](int x, int y) {
return w[x] < w[y];
});
while (p.size() and w[p.back()] > W) {
p.pop_back();
}
if (p.empty() or accumulate(p.begin(), p.end(), 0LL, [&](long long sum, int x) { return sum + w[x]; }) < mid_W) {
cout << -1 << "\n";
continue;
}
if (w[p.back()] >= mid_W) {
cout << 1 << "\n" << p.back() + 1 << "\n";
continue;
}
vector<int> v;
long long sum = 0;
for (auto i : p) {
sum += w[i], v.push_back(i);
if (sum > mid_W) break;
}
cout << v.size() << "\n";
for (auto i : v) cout << i + 1 << " \n"[i == v.back()];
}
return 0;
}

D. Catching Cheaters

题意

给出两个字符串 \(s, t\) ,定义: \(f(s, t) = 4 \cdot LCS(s, t) - |s| - |t|\) 。

找出 \(s, t\) 所有连续子串匹配的可能情况中最大的函数值。

题解

\(dp_{ij}\) 的含义为以 \(s_i\) 和 \(t_j\) 结尾的两个连续子串匹配的最大函数值。

状态转移方程分为两种情况:

  • \(s_i = t_j\)

    • 可以在以 \(s_{i - 1}\) 和 \(t_{j - 1}\) 结尾的两个子串尾部各添加一个字符,即 \(dp_{ij} = dp_{i - 1 j - 1} + 2\)
    • 也可以在两个空串尾部添加一个字符,即 \(dp_{ij} = 0 + 2\)
  • \(s_i \ne t_j\)
    • 可以在以 \(s_{i - 1}\) 或 \(t_{j - 1}\) 结尾的一个子串尾部添加一个字符,即 \(dp_{ij} = max(dp_{i - 1 j}, dp_{i j - 1}) - 1\)

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
string s, t;
cin >> s >> t;
vector<vector<int>> dp(n + 1, vector<int>(m + 1));
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (s[i - 1] == t[j - 1]) dp[i][j] = max(0, dp[i - 1][j - 1]) + 2;
else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) - 1;
ans = max(ans, dp[i][j]);
}
}
cout << ans << "\n";
return 0;
}

Codeforces Round #683 (Div. 2, by Meet IT)【ABCD】的更多相关文章

  1. Codeforces Round #683 (Div. 2, by Meet IT) D. Catching Cheaters (DP)

    题意:给你两个字符串,每次取它们的子串C和D,然后求LCS,得到的贡献为\(4*LCS(C,D)-|C|-|D|\),求最大贡献. 题解:首先应该了解\(O(n^2)\)的LCS的dp写法,然后在此基 ...

  2. Codeforces Round #683 (Div. 2, by Meet IT)

    A 初始情况\(1\) ~ \(n\)堆分别有 \(1\) ~ \(n\) 个糖果,第\(i\)次操作给除了所选堆的糖果数 \(+ i\), 找到一种方案可以使得所有堆糖果数相同,输出操作次数和每次选 ...

  3. Codeforces Round #540 (Div. 3) C. Palindromic Matrix 【暴力】

    任意门:http://codeforces.com/contest/1118/problem/C C. Palindromic Matrix time limit per test 2 seconds ...

  4. Codeforces Round #455 (Div. 2) A. Generate Login【贪心】

    A. Generate Login time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  5. Codeforces Round #683 (Div. 1) Solution

    A. Knapsack 猜个结论--先把所有的东西加起来,如果小于 \(\frac{1}{2}m\) 就输出不合法:如果在 \([\frac{1}{2}m, m]\)之间直接全部输出:若大于 \(m\ ...

  6. Codeforces Round #538 (Div. 2) D. Flood Fill 【区间dp || LPS (最长回文序列)】

    任意门:http://codeforces.com/contest/1114/problem/D D. Flood Fill time limit per test 2 seconds memory ...

  7. Codeforces Round #521 (Div. 3) D. Cutting Out 【二分+排序】

    任意门:http://codeforces.com/contest/1077/problem/D D. Cutting Out time limit per test 3 seconds memory ...

  8. Codeforces Round #254 (Div. 2) DZY Loves Chemistry【并查集基础】

    一开始不知道题意是啥意思,迟放进去反应和后放进去反应有什么区别 对于第三组数据不是很懂,为啥312,132的组合是不行的 后来发现这是一道考察并查集的题目 QAQ 怒贴代码: #include < ...

  9. Codeforces Round #555 (Div. 3) E. Minimum Array 【数据结构 + 贪心】

    一 题面 E. Minimum Array 二 分析 注意前提条件:$0 \le  a_{i} \lt n$ 并且 $0 \le  b_{i} \lt n$.那么,我们可以在$a_{i}$中任取一个数 ...

随机推荐

  1. 人生苦短我用Python,本文助你快速入门

    目录 前言 Python基础 注释 变量 数据类型 浮点型 复数类型 字符串 布尔类型 类型转换 输入与输出 运算符 算术运算符 比较运算符 赋值运算符 逻辑运算符 if.while.for 容器 列 ...

  2. ssh信任 sftp用法 scp用法【转】

    为了进行批量关机工作,前提要配置好ssh的双机信任. A机192.168.1.241 B机192.168.1.212 在A机上获取一个pub密钥,即为公共密钥. 执行这个命令后:ssh-keygen  ...

  3. 【C++】《C++ Primer 》第二章

    第二章 变量和基本类型 指针和引用的不同点 引用不是一个对象,它没有实际地址,但是指针是一个对象.允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象. 指针无须在定义时赋初值.

  4. 编译安装 nginx -1.14.2

    编译安装 nginx -1.14.2 1 ) 下载nginx-1.14.2 源码包: wget http://nginx.org/download/nginx-1.14.2.tar.gz 2 ) 编译 ...

  5. mysql—information_schema数据库

    一.介绍 MySQL中有一个默认数据库名为information_schema,在MySQL中我们把 information_schema 看作是一个数据库,确切说是信息数据库.其中保存着关于MySQ ...

  6. oracle动态采样导致数据库出现大量cursor pin s wait on x等待

    生产库中,突然出现了大量的cursor pin s wait on x等待,第一反应是数据库出现了硬解析,查看最近的DDL语句,没有发现DDL.那么有可能这个sql是第一次进入 在OLTP高并发下产生 ...

  7. Flask的“中间件”

    特殊装饰器 from flask import Flask,render_template,request app = Flask(__name__) @app.before_request def ...

  8. 前端面试之JavaScript中this的指向【待完善!】

    JavaScript中this的指向问题! 另一个特殊的对象是 this,它在标准函数和箭头函数中有不同的行为. 在标准函数中, this 引用的是把函数当成方法调用的上下文对象,这时候通常称其为 t ...

  9. jmeter进行分布式压测过程与 注意事项

    jmeter命令行运行但是是单节点下的, jmeter底层用java开发,耗内存.cpu,如果项目要求大并发去压测服务端的话,jmeter单节点难以完成大并发的请求,这时就需要对jmeter进行分布式 ...

  10. SQL Server 邮箱告警配置

    目录 配置数据库邮件 * 手动启用数据库邮件功能 * 配置数据库邮件 * 测试数据库邮件 实现 JOB 任务运行状态的检测 * 定义操作员 * 新建死锁警报 * 设置 SQL Server 代理 创建 ...