23.10.15周报

  这周虽从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级里名次也平平,路漫漫其修远兮.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值