CodeForces - 1660C

题目传送门:https://vjudge.net/contest/535955#problem/C

题意:询问一个字符串最少删去几个字符,能够把这个字符串变成aabbccdd这种两两相同的字符串

题解:我们来一个样例:aabbdabbdccc,就这个样例我们可以从前往后遍历,如果map发现一个字符出现了两次,那就说明这个字符我们不需要删去,我们只需要删去map中除了这个字符的所有字符即可,或者我们可以倒着想,我们用字符串长度ans减去2即可,最后的ans一定代表现在需要删去的字符数量,我们能够去实践出这种删除方法一定是最贪的,就这个样例而言,ans=12,aa ans-=2;bb ans-=2;dabb ans-=2;dcc ans-=2;c;最终ans=4。

点击查看代码
#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define all(x) (x).begin(), (x).end()
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
const int inf = 0x3f3f3f3f;
map<char, int> mp;
int main(void)
{
Zeoy;
int t;
cin >> t;
while (t--)
{
mp.clear();
string s;
cin >> s;
int n = s.length();
s = "*" + s;
int ans = n;
for (int i = 1; i <= n; ++i)
{
if (mp[s[i]] == 0)
mp[s[i]]++;
else
{
ans -= 2;
mp.clear();
}
}
cout << ans << endl;
}
return 0;
}

CodeForces - 1660D

题目传送门:https://vjudge.net/contest/535955#problem/D

题意:给你一个数组a,里面的元素ai∈[-2,2],让你求数组首尾各删掉多少个元素,能够得到最大的数组各元素之积,并规定空数组值为1

题解:我们可以想一想对于一个数组中的0来说,我们去乘0没有意义,不管怎么都还是0,所以实际上0其实是分界线,我们把一个数组通过0分成几段,然后我们对每段进行处理,但是注意n的范围:1≤n≤2e5,说明如果我们把乘积乘出来一定会爆long long,所以我们决定把幂次记录,因为只有±1和±2的存在,对于每段数组大小我们用±2的数量记录,同时我们也要去记录元素<0的数量,所以一定会出现两种情况:

1.这一段积本身>0:也就是说小于0的元素的个数是偶数,那么这就是答案,我们不需要处理,再怎么处理,积的大小只会减小;

2.这一段积本身<0:也就是说小于0的元素的个数是奇数,那么我们需要找到从左边找的第一个负数和从右边找起的第一个负数,比较删去哪一个会使积更大

每一次求出来的积,我们还需要和ans比较,取大者,并记录左区间l和右区间r,最后输出即可。

`

点击查看代码
#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define all(x) (x).begin(), (x).end()
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
const int inf = 0x3f3f3f3f;
int main(void)
{
Zeoy;
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
vector<int> a(n + 2), pre1(n + 2), pre2(n + 2);
for (int i = 1; i <= n; ++i)
{
cin >> a[i];
pre1[i] = pre1[i - 1] + (abs(a[i]) == 2); //前缀和记录±2的个数
pre2[i] = pre2[i - 1] + (a[i] < 0); //前缀和记录负数的个数
}
a.push_back(0); //保证最后一段能够被处理
vector<int> v;
int ans = -inf; //代表区间中±2最多的个数,即幂次
int l, r;
for (int i = 1; i <= n + 1; ++i)
{
if (a[i] != 0) //将各段分割在v中
v.push_back(i); //一个细节:将下标存在v中
else
{
int k = v.size();
if (k == 0)
continue;
int cnt = pre2[v[k - 1]] - pre2[v[0] - 1]; //求负数的个数
// cout << cnt << endl;
if (cnt % 2 == 0) //负数个数是偶数的情况,本身就是答案
{
if (pre1[v[k - 1]] - pre1[v[0] - 1] > ans)
{
ans = pre1[v[k - 1]] - pre1[v[0] - 1];
l = v[0];
r = v[k - 1];
}
}
else //负数个数是奇数的情况,我们找左边和右边第一个负数
{
int ii = -1, jj = -1;
for (int i = 0; i < k; ++i)
{
if (a[v[i]] < 0)
{
ii = i;
break;
}
}
for (int i = k - 1; i >= 0; --i)
{
if (a[v[i]] < 0)
{
jj = i;
break;
}
}
if (pre1[v[k - 1]] - pre1[v[ii]] > ans)
{
ans = pre1[v[k - 1]] - pre1[v[ii]];
l = v[ii] + 1;
r = v[k - 1];
}
if (pre1[v[jj] - 1] - pre1[v[0] - 1] > ans)
{
ans = pre1[v[jj] - 1] - pre1[v[0] - 1];
l = v[0];
r = v[jj] - 1;
}
}
v.clear(); //别忘记清空容器
}
}
if (ans < 1) //别忘记空数组=1,如果没有±2,我们直接将数组删完
{
cout << "0 " << n << endl;
}
else
{
cout << l - 1 << " " << n - r << endl;
}
}
return 0;
}

`

CodeForces - 1660E

题目传送门:https://vjudge.net/contest/535955#problem/E

题意:给你一个只有0和1的矩阵,你可以进行两种操作,一种是将矩阵上下左右滚动,类似环,这种操作没有花费;另一种是可以将任意元素反转,

1->0,0->1,这种操作每一花费为1,让你用最小花费将矩阵变为单位阵。

题解:我们很容易能求出将矩阵变为单位阵的花费:矩阵所有元素个数-对角线上1的个数-非对角线上0的个数=nn-n-num0-2y,y代表对角线上1的个数,我们发现想要使得花费最小,因为n和num0是一定的,所以我们只要使得对角线上的1最多即可,那么对于这一个可以滚动的类似环的操作我们该怎么去求



或者我们再拼三个一样的矩阵



本质没有区别

点击查看代码
#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define all(x) (x).begin(), (x).end()
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
const int inf = 0x3f3f3f3f;
char g[2010][2010] = {0};
int main(void)
{
Zeoy;
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
ll cnt0 = 0;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
cin >> g[i][j];
if (g[i][j] == '0')
cnt0++;
}
}
int ans = 0;
for (int k = 1; k <= n; ++k)
{
int sum = 0;
int j = k;
for (int i = 1; i <= n; ++i)
{
sum += g[i][j] - '0';
j = j % n + 1;
}
ans = max(sum, ans);
}
cout << n * n - ans - (cnt0 - (n - ans)) << endl;
}
return 0;
}
点击查看代码
#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define all(x) (x).begin(), (x).end()
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
const int inf = 0x3f3f3f3f;
char g[4025][4025] = {0};
int main(void)
{
Zeoy;
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
int num0 = 0;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
cin >> g[i][j];
g[i + n][j] = g[i][j];
g[i][j + n] = g[i][j];
g[i + n][j + n] = g[i][j];
if (g[i][j] == '0')
num0++;
}
}
int y = 0;
for (int k = 1; k <= n; ++k)
{
int cnt = 0;
int j = k;
for (int i = 1; i <= n; ++i)
{
if (g[i][j] == '1')
cnt++;
j++;
}
y = max(cnt, y);
}
cout << n * n + n - num0 - 2 * y << endl;
}
return 0;
}

CodeForces - 1660F1

题目传送门:https://vjudge.net/contest/535955#problem/F

题意:一个字符串只由+-号组成,长度为n,定义+和-数量相同的字符串叫做平衡字符串,先给你一个字符串,你可以进行这样的操作:将相邻两个-变为+,操作数量不限,让你求这个字符串中有多少个子集,能够通过这样的操作变为平衡字符串。1≤n≤3000,1<=t<=500

题解:直接给出规律,y代表-的个数,x代表+的个数,如果(y-x)%3==0 && y>=x,就代表它可以构成平衡字符串,因为n<3000,我们直接前缀和O(n*n)枚举

点击查看代码
#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define all(x) (x).begin(), (x).end()
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
const int inf = 0x3f3f3f3f;
int prez[3010] = {0};
int pref[3010] = {0};
int main(void)
{
Zeoy;
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
string s;
cin >> s;
s = "*" + s;
for (int i = 1; i <= n; ++i)
{
prez[i] = prez[i - 1] + (s[i] == '+');
pref[i] = pref[i - 1] + (s[i] == '-');
}
int ans = 0;
for (int i = n; i >= 2; --i)
{
for (int j = 0; j < i; ++j)
{
int x = prez[i] - prez[j];
int y = pref[i] - pref[j];
if ((y - x) % 3 == 0 && y >= x)
{
ans++;
}
}
}
cout << ans << endl;
}
return 0;
}

CodeForces - 1660F2

题目传送门:https://vjudge.net/contest/535955#problem/G

题意:上题hard版,1≤n≤2e5,1≤t≤1e4

题解:待补

HZNU Winter Trainning 7 补题 - Zeoy的更多相关文章

  1. hdu5017:补题系列之西安网络赛1011

    补题系列之西安网络赛1011 题目大意:给定一个椭球: 求它到原点的最短距离. 思路: 对于一个椭球的标准方程 x^2/a^2 + y^2/b^2 +z^2/c^2=1 来说,它到原点的最短距离即为m ...

  2. 2017河工大校赛补题CGH and 赛后小结

    网页设计课上实在无聊,便开始补题,发现比赛时候僵着的东西突然相通了不少 首先,"追妹"这题,两个队友讨论半天,分好多种情况最后放弃(可是我连题目都没看啊),今天看了之后试试是不是直 ...

  3. 2018 HDU多校第四场赛后补题

    2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...

  4. 2018 HDU多校第三场赛后补题

    2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...

  5. [数]补题ver.

    上次补题好像把两次训练混在一起了,总之先按时间顺序补完这一次|ू・ω・` ) HDU-6301 不会的东西不能逃避.jpg 红小豆非常讨厌构造题,因为非常不会,并且非常逃避学习这类题,因为总也搞不清楚 ...

  6. 4.30-5.1cf补题

    //yy:拒绝转载!!! 悄悄告诉你,做题累了,去打两把斗地主就能恢复了喔~~~ //yy:可是我不会斗地主吖("'▽'") ~~~那就听两遍小苹果嘛~~~ 五一假期除了花时间建模 ...

  7. ICPC南京补题

    由于缺的题目比较多,竟然高达3题,所以再写一篇补题的博客 Lpl and Energy-saving Lamps During tea-drinking, princess, amongst othe ...

  8. 2018 CCPC 桂林站(upc复现赛)补题

    2018 CCPC 桂林站(upc复现赛)补题 G.Greatest Common Divisor(思维) 求相邻数的差值的gcd,对gcd分解素因子,对所有的素因子做一次遍历,找出最小答案. 几个样 ...

  9. 【cf补题记录】Codeforces Round #608 (Div. 2)

    比赛传送门 再次改下写博客的格式,以锻炼自己码字能力 A. Suits 题意:有四种材料,第一套西装需要 \(a\).\(d\) 各一件,卖 \(e\) 块:第二套西装需要 \(b\).\(c\).\ ...

  10. 【cf补题记录】Codeforces Round #607 (Div. 2)

    比赛传送门 这里推荐一位dalao的博客-- https://www.cnblogs.com/KisekiPurin2019/ A:字符串 B:贪心 A // https://codeforces.c ...

随机推荐

  1. 【JS设计模式笔记】给我一张名片-工厂方法模式(创建型)

    广告展现 例如,关于计算机培训广告资源需要投放,一批是Java的用绿色字体,一批是PHP的,用黄色字体,红色背景. // 创建Java学科类 var Java = function (content) ...

  2. k8s 中的 Service 简介【k8s 系列之二】

    〇.前言 k8s 集群中的每一个 Pod 都有自己的 IP 地址,那么是不是有 IP 了,访问起来就简单了呢,其实不然. 因为在 k8s 中 Pod 不是持久性的,摧毁重建将获得新的 IP,客户端通过 ...

  3. Angular 18+ 高级教程 – 大杂烩

    前言 本篇记入一些 Angular 的小东西. Angular 废弃 API 列表 Docs – Deprecated APIs and features Using Tailwind CSS wit ...

  4. Servlet——Response对象

    Response对象         Response 设置响应数据   1.响应行          void setStatus(int sc):设置响应状态码   2.响应头           ...

  5. Response状态码

    1.数据是否正常 2.文件是否存在 3.地址自动跳转 4.服务提供错误 注:容错处理识别 •-1xx:指示信息-表示请求已接收,继续处理. •-2xx:成功-表示请求已经被成功接收.理解.接受. •- ...

  6. std::vector 和 std::map 都支持以下比较运算符

    在 C++ 标准库中,std::vector 和 std::map 都支持以下比较运算符: ==(相等运算符) !=(不等运算符) <(小于运算符) <=(小于等于运算符) >(大于 ...

  7. watch 监视搜索关键词的变化不断发送请求返回建议

    watch: { keywords: { // yarn add lodash 下载lodash包 // import { debounce } from "lodash"; 引入 ...

  8. element+vue2下的input的样式修改

    /* 禁用下的input的字体颜色 */ /* .el-input.is-disabled /deep/ .el-input__inner { color: red; } */ /* 禁用下的inpu ...

  9. 云原生周刊:一条 Kubernetes 命令引发的悲剧

    开源项目 KSail 用于在 Docker 中配置支持 GitOps 的 K8s 集群的 CLI 工具. nginx-gateway-fabric NGINX Gateway Fabric 是一个开源 ...

  10. 黑神话:悟空电脑太卡?配置不够?ToDesk云电脑入门新手教程

    许多玩家在玩<黑神话:悟空>时会遭遇硬件配置不足导致的游戏卡顿.画面不流畅等问题. 其实这个难题很好解决,用ToDesk云电脑即可迎刃而解.即使你的本地电脑配置不高,也能享受到流畅的游戏体 ...