A:铁路线
题目描述
铁路线有 N 个车站,编号为 1, 2, ..., N 。
在这条线路上,有趟进站列车从 1 站出发,依次停靠 2, 3, ..., N 站,有趟出站列车从 N 站出发,依次停靠 N - 1, N-2, ..., 1 站。
小奇即将从 X 站开往 Y 站,只需使用进站和出站列车中的一列。
求这趟列车在 Z 站是否停车。
输入
N X Y Z
输出
如果列车在从 X 站到 Y 站的过程中在 Z 站停车,则打印 "Yes";否则打印 "No"。
样例输入1
7 6 1 3
样例输出1
Yes
打卡题
思路:其实N是个无用的变量,只看X,Y,Z就可以
#include<iostream>
using namespace std;
int main(){
int n,x,y,z;
cin>>n>>x>>y>>z;
for(int i=min(x,y);i<=max(x,y);i++){
if(i==z){
cout<<"Yes";
return 0;
}
}
cout<<"No";
return 0;
}
B:打字
题目描述
小奇尝试使用键盘输入由小写英文字母组成的字符串 S 。他打字时只看键盘,不看屏幕。
每当他错误地输入一个不同的小写英文字母时,他就立即按下退格键。然而,退格键被破坏了,因此误键入的字母没有被删除,实际键入的字符串是 T 。
他没有误按小写英文字母以外的任何键。
T 中未被误输入的字符称为正确输入字符。
确定正确键入的字符在 T 中的位置。
输入
S
T
输出
假设 |S| 是 S 的长度。如果正确键入的字符是 T 的 第 A1 , A2 , ... , A{|S|} 个 字符,则按此顺序打印 A1, A2, ..., A{|S|} 的值,并用空格分隔。
确保输出按升序。也就是说,每个 1 <= i <= |S| - 1 都应包含 Ai < A{i + 1} 。
样例输入1
abc
axbxyc
样例输出1
1 3 6
简单题
思路:分析样例1
小奇打字的顺序如下:键入 `a`。 尝试输入 `b`,但错误地输入了 `x`。按退格键,但字符没有删除。输入 `b`。尝试输入 `c`,但错误地输入了 `x`。按退格键,但字符未删除。 尝试输入 `c`,但错误地输入了 `y`。 按退格键,但字符未删除。 输入 `c`。正确键入的字符是第一、第三和第六个字符。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+6;
int main(){
string s,t;
int a[N],b[N];
int h1,h2;
cin>>s>>t;
for(int i=0;i<t.size();i++){
if(t[i]==s[h1]){
h1++;
printf("%d ",i+1);
continue;
}
else continue;
}
return 0;
}
C:站在巨人的肩上
题目描述
有 N 个巨人,他们的名字分别是 1 到 N 。当巨人 i 站在地上时,他们的肩高是 Ai ,头高是 Bi 。
你可以选择 (P1, P2, ..., Pn) 的 (1, 2, ..., N) 的排列组合,并根据以下规则堆叠 N 个巨人:
首先,将巨人 P1 放在地上。巨人 P1 的肩膀距离地面的高度为 A{P1} ,头部距离地面的高度为 B{P1} 。
以 i = 1, 2, ..., N - 1 的顺序,把巨人 P{i + 1} 放在巨人 Pi 的肩膀上。如果巨人 Pi 的肩膀距离地面的高度是 t ,那么巨人 P{i + 1} 的肩膀距离地面的高度就是 t + A{P{i + 1}} ,他们的头距离地面的高度就是 t + B{P{i + 1}} 。
求最上面的巨人 Pn 的头部距离地面的最大可能高度。
输入
N
A1 B1
A2 B2
...
An Bn
输出
打印答案
样例输入1
3
4 10
5 8
2 9
样例输出1
18
思路:枚举最后的巨人是哪个,那么其头高就是 ,所有可能的情况取最大值即为答案
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct Node {
int a,b;
}a[200005];
int n,res=0,ans;
signed main() {
cin>>n;
for(int i=1;i<=n;++i){cin>>a[i].a;cin>>a[i].b;res+=a[i].a;}
for(int i=1;i<=n;++i)ans=max(ans,res-a[i].a+a[i].b);
cout<<ans;
return 0;
}
D:置换子序列
题目描述
给你一个 (1, 2, ..., N) 的排列组合 P = (P1, P2, ..., PN) 。
长度为 k 的索引序列 (𝑖1, 𝑖2, ..., 𝑖𝑘) 如果同时满足以下两个条件,则称为好索引序列:
- 1 <= 𝑖1 < 𝑖2 < ... < 𝑖𝑘 <= N .
- 子序列 (𝑃𝑖1,𝑃𝑖2, , ..., 𝑃𝑖𝑘) 可以通过重新排列成连续的 k 个整数。
形式上,存在一个整数 a ,使得 { 𝑃𝑖1,𝑃𝑖2, , ..., 𝑃𝑖𝑘 } = { a,a+1,...,a+k-1 }
求所有好的索引序列中 𝑖𝑘- 𝑖1 的最小值。可以证明,在此问题的约束条件下,至少存在一个好的索引序列。
输入
N K
P1 P2 ... PN
输出
打印所有良好索引序列中 𝑖𝑘- 𝑖1 的最小值。
样例输入1
4 2
2 3 1 4
样例输出1
1
思路:用set
#include<bits/stdc++.h>
using namespace std;
long long n,k,a[1000005],ans=1e10,pos[1000005];
set<long long>s;
int main(){
cin.tie(0);
cout.tie(0);
cin>>n>>k;
for(int i=1;i<=n;i++){cin>>a[i],pos[a[i]]=i;}
for(int i=1;i<=k;i++)s.insert(pos[i]);
ans=*(--s.end())-*s.begin();
for (int i=k+1;i<=n;i++){
s.erase(pos[i-k]);
s.insert(pos[i]);
ans=min(ans,*(--s.end())-*s.begin());
}
cout<<ans;
return 0;
}
本期到此结束,求E,F解法,请大神们发到聊天区里,万分感谢。