前四题手速题
A. Three Friends
#include<bits/stdc++.h>
using namespace std;
int n,a[10];
int main()
{
n=3;
int _;cin>>_;while(_--)
{
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
sort(a+1,a+1+n);
if(a[1]<a[2]) a[1]++;
else if(a[1]==a[2]&&a[1]<a[3]) a[1]++,a[2]++;
if(a[3]>a[2]) a[3]--;
else if(a[3]==a[2]&&a[2]>a[1]) a[2]--,a[3]--;
int ans=a[3]-a[2]+a[2]-a[1]+a[3]-a[1];
printf("%d\n",ans);
}
}
B. Snow Walking Robot
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
char s[N];
int main()
{
int _;cin>>_;while(_--)
{
scanf("%s",s+1);
int n=strlen(s+1);
int t[10];
t[0]=t[1]=t[2]=t[3]=0;
int f=1;
for(int i=1;i<=n&&f;++i){
if(s[i]=='L') t[0]++;
else if(s[i]=='R') t[1]++;
else if(s[i]=='U') t[2]++;
else t[3]++;
}
int x=min(t[0],t[1]);
int y=min(t[2],t[3]);
if(x&&y){
printf("%d\n",2*x+2*y);
for(int i=1;i<=x;++i) printf("L");
for(int i=1;i<=y;++i) printf("U");
for(int i=1;i<=x;++i) printf("R");
for(int i=1;i<=y;++i) printf("D");
puts("");
}
else if(x){
puts("2");
printf("LR\n");
}
else if(y){
puts("2");
printf("UD\n");
}
else puts("0");
}
}
C. Yet Another Broken Keyboard
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
char s[N];
int k,vis[30],n;
int main()
{
scanf("%d%d",&n,&k);
scanf("%s",s+1);
for(int i=1;i<=k;++i) {
char c;
cin>>c;
vis[c-'a']=1;
}
ll ans=0;
for(int i=1;i<=n;++i){
int id=i;
if(vis[s[id]-'a']){
while(id+1<=n&&vis[s[id+1]-'a']) ++id;
ll len=id-i+1;
ans+=len*(len+1)/2;
i=id;
}
}
printf("%lld\n",ans);
}
D. Remove One Element
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10,inf=0x3f3f3f3f;
int l[N],r[N],n,a[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
int t=1;
for(int i=1;i<=n;++i){
if(a[i]<=a[i-1]) t=i;
l[i]=t;
}
t=n;
a[n+1]=inf;
for(int i=n;i>=1;--i){
if(a[i]>=a[i+1]) t=i;
r[i]=t;
}
int ans=0;
for(int i=1;i<=n;++i) ans=max(ans,r[i]-l[i]+1);
for(int i=2;i<=n-1;++i){
if(a[i+1]>a[i-1]) {
ans=max(ans,r[i+1]-l[i-1]);
}
}
printf("%d\n",ans);
}
/*
1 2 3 2 3 4 5 6
1 2 3 3 3 3 4 5
5 5 5 5 4 3 2 1
*/
E. Nearest Opposite Parity
根据题意可以构造一个图,但是权值是逆着图传递,那我们反向建图即可。。。从答案为1的点开始遍历图
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N],n,dp[N];
vector<int>G[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
dp[i]=-1;
}
queue<int>que;
int tmp=0;
for(int i=1;i<=n;++i){
if(i+a[i]<=n) G[i+a[i]].push_back(i);
if(i+a[i]<=n&&a[i]%2!=a[i+a[i]]%2) {
que.push(i),dp[i]=1;
}
if(i-a[i]>=1) G[i-a[i]].push_back(i);
if(i-a[i]>=1&&a[i]%2!=a[i-a[i]]%2) {
que.push(i),dp[i]=1;
}
}
while(que.size()){
int id=que.front();que.pop();
for(int v:G[id]) {
if(dp[v]==-1){
dp[v]=dp[id]+1;
que.push(v);
}
}
}
for(int i=1;i<=n;++i) printf("%d ",dp[i]);
puts("");
return 0;
}
/*
10
10 3 10 3 5 4 10 9 9 8
*/