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. Typora mac激活

    typora mac版本激活 我也是第一次使用mac电脑,在安装时基本上都是付费的,在mac下载使用typora是试用一段时间后是需要付费购买的,苦无能力有限只能绕一下,感谢网上的各位大佬的分享 来源 ...

  2. 深度学习环境安装-conda-torch-Jupyter Notebook

    conda的安装 为什么要安装这个,它是什么? 它是一个管理环境的,当我们跑项目的时候,往往这些项目所需要的pickets库和环境是不同的,这时候如果自己的电脑里面只有一个版本的库的话,就运行不了,比 ...

  3. 所见即所得,赋能RAG:PDF解析里的段落识别

    前几天,有一位用户使用OCR产品识别多栏论文后向我们询问:要怎么解决不合适的断句.分段以及错误阅读顺序的问题? 我们用一个相似案例为大家直观展示这位用户遇到的情况. 如图中的多栏期刊,如果用OCR识别 ...

  4. TFC-Pretraining: 基于时间频率一致性对时间序列进行自监督对比预训练《Self-Supervised Contrastive Pre-Training for Time Series via Time-Frequency Consistency》(时间序列、时序表征、时频一致性、对比学习、自监督学习)

    2023年11月10日,今天看一篇论文,现在17:34,说实话,想摆烂休息,不想看,可还是要看,拴Q. 论文:Self-Supervised Contrastive Pre-Training for ...

  5. MOGA-Net: 多目标遗传算法求解复杂网络中的社区《A Multiobjective Genetic Algorithm to Find Communities in Complex Networks》(遗传算法、多目标优化算法、帕累托最优)

    论文:A Multiobjective Genetic Algorithm to Find Communities in Complex Networks GitHub: IEEE 2012的论文. ...

  6. 新手指南-新人入职-maven相关

    一.前言 入职后,发现公司是用Maven对项目进行管理和构建. 一般来说,自己先确定以下几点: 1.公司对版本是否有要求. 2.是否要求IDEA对maven有特殊的配置. 3.确定自己的 MAVEN_ ...

  7. 如何在SQL中查找某一字段在哪些表中

    在SQL中,要找出数据库中包含特定字段(列)的所有表,可以使用数据库的系统表或信息架构视图.不同的数据库系统(如MySQL, SQL Server, PostgreSQL等)有不同的系统表和查询方式. ...

  8. Java使用snmp协议采集服务器信息

    Java使用snmp协议采集服务器信息    一.snmp简介   SNMP是专门设计用于在 IP 网络管理网络节点(服务器.工作站.路由器.交换机及Hubs等)的一种标准协议,它是一种应用层协议. ...

  9. 《你必须掌握的Entity Framework 6.x与Core 2.0》代码下载

      https://item.jd.com/12376014.html<你必须掌握的Entity Framework 6.x与Core 2.0>代码下载,共享代码: https://git ...

  10. 云原生爱好者周刊:VMware Tanzu 社区办发布,无任何限制!

    云原生一周动态要闻: VMware Tanzu 推出社区版 Kubernetes Cluster API 1.0 版已生产就绪 Linkerd 2.11 发布 Cartografos 工作组推出云原生 ...