这周虽从9号开始,但因7号,8号调休,所以把7号,8号的训练也计入这周内.
7号的第一题如下
大致题意:两字母的距离指其在字母表上的距离,如a与z距离为25.两字符串的距离为各下标对应字母距离之和.如ab与zc距离为25+1也就是26.现给你一字符串s和数字k,让你找出和s距离和为k的任意字符串(长度需相等),如无符合条件字符串输出-1.
思路:先判断有无符合条件字符串,遍历s用一变量sum记录能达到的最大距离和,与k比较,若小于k则输出-1.之后再遍历s,对于每一字符,有两种情况,一种与a或z的距离(取更大值)小于等于k,一种大于k.第一种情况就将字符改为a或z,k减去其距离,第二就向a或z方向改动k的值,退出循环.
代码如下:
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1e6+6;
int n,k;
string s;
int sum;
void solve(){
cin >> n >> k;
cin >> s;
for(int i=0;i<n;i++) sum+=max(s[i]-'a','z'-s[i]);
if(sum<k) {cout << -1; return ;}
for(int i=0;k;i++){
if(k>=max(s[i]-'a','z'-s[i])){
k-=max(s[i]-'a','z'-s[i]);
s[i]=s[i]-'a'>'z'-s[i]?'a':'z';
}else{
if(s[i]-'a'<=k) s[i]+=k;
else s[i]-=k;
k=0;
}
}
cout << s;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t=1;
//cin >> t;
while(t--) solve();
return 0;
}
//make it count
第二题:
题意:一人用两台电视看一晚上节目,最多可同时放两个不同节目,给出节目数量和开始,结束的时间,问能不能用两台电视看完而不漏掉任何内容,需要注意的是,如在节目a结束的同时节目b开始了,无法做到无缝切换,所以算作没看完整.
思路:一道比较经典的离散化,把所有时间存入vector数组,排序后用一cnt变量依次判断即可.需要注意的是,因为无法无缝切换节目,所以如存在时间同时有节目开始和结束,需先判断开始的节目,排序时注意一下即可.
代码如下:
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=2e5+10;
int n;
int cnt;
vector<pair<int,int>>ve;
void solve(){
cin >> n;
for(int i=1;i<=n;i++){
int l,r;
cin >> l >> r;
ve.push_back({l,0});
ve.push_back({r,1});
}
sort(ve.begin(),ve.end());
for(int i=0,j=ve.size();i<j;i++){
if(!ve[i].second) cnt++;
if(cnt>2) {cout << "NO"; return ;}//同时播放的节目数>2,结束退出
if(ve[i].second) cnt--;
}
cout << "YES";
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t=1;
//cin >> t;
while(t--) solve();
return 0;
}
//make it count
8号第一题如下
题意:忘了,懒得翻译 下标(按顺序)存着不同的数字(乱序),一个读取器要按顺序读取乱序数字,每次时间为下标之差,问读取总时间
思路:这道题比较奇怪所以有点印象,对输入做点处理就ok了,也就是把下标改为乱序的数字,然后即可按顺序遍历数组.这道题应该还有其他的思路和做法.
代码如下:
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=2e5+10;
int n,k;
int f[N];
int ans;
void solve(){
cin >> n;
for(int i=1;i<=n;i++){
int tmp;
cin >> tmp;
f[tmp]=i;
}
for(int i=1;i<n;i++)
ans+=f[i+1]>f[i]?f[i+1]-f[i]:f[i]-f[i+1];
cout << ans;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t=1;
//cin >> t;
while(t--) solve();
return 0;
}
//make it count
第三题:
题意:判断一字符串是否长得对称,对你没听错,是长得左右对称.头一次见这种视觉题,不过没啥意思,而且n,m这种也是不对称的,但题不会给你明说.
9号训练如下:
第一题比较常规,就不说了,不过可能是思路不够简化,导致代码也比较丑陋,而且还因填坑wa了很多发.
第二题:
题意:找字符串最长子串,要求0和1的数量相等.
思路:将0处理为-1,即可得出前缀和数组,数字一样即中间0,1数量一样.应该还有其他思路
第三题一道比较恶心的模拟,将输入数处理为科学计数法.
10号打了个比赛.
11号训练如下:
题意:一字符串中,如任意长度为k的子串都含有一字符,称其为kd,给一字符串s,找出最短k,使kd存在
思路;一道美丽的二分加滑动窗口,清清爽爽
12号训练如下:
题意:三个花圈,每个有其闪烁间隔时间,问能否安好后,每秒至少存在一个花圈在闪
思路:看似模拟,实则情况判断题,将几种符合条件的情况判断下就可以了
13号训练:
做了一道题,那题也没啥好说的
14号训练:
a题纯暴力,但是写不来,怎么都看不懂,让我意识写暴力也是要脑子的
b题是之前遇到过的树状数组题,所以我去把树状数组学了下,基本原理算是整明白了,但拿b题练手发现还是有点难,准备再找点题巩固下.
15号打了个比赛,东软的题单,做的很一般,在东软22级里名次也平平,路漫漫其修远兮.