A
题意:
上台阶奇数和偶数分别多少可以实现是从a到b连着上的(a>=1)
tip:
0,0不可以,至少上了一节
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
void init(){
int a,b;
scanf("%d%d",&a,&b);
if(a == 0&& b == 0) printf("NO\n");
else if(b-a == 1||b-a == 0||a-b == 1) printf("YES\n");
else printf("NO\n");
}
int main(){
init();
return 0;
}
B
题意:
一个圈圈上有好多点,找一个点逆时针走一圈和所有上面点的距离给你。。。再来一个人也是这样,问他俩是不是在同一个圈圈上
tip:
最后一个点和第一个点的距离,是周长-所有其他的点直接距离和。然后遍历找有没有完全重合的方式
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[110],c[110];
void init(){
int b,n,l,bu;
bu = 0;
scanf("%d%d",&n,&l);
for(int i = 0 ; i < n ; i++){
scanf("%d",&b);
a[i] = b-bu;
bu = b;
}
bu = 0;
a[0] += l-b;
for(int i = 0; i < n ; i++){
scanf("%d",&b);
c[i] =b- bu;
bu = b;
}
c[0] += l-b;
for(int i = 0; i < n ; i++){
int j = 1,k = i;
for(j = 0; j < n ; j++){
if(a[k] != c[j])
break;
else {
k = (k+1)%n;
}
}
if(j == n){
printf("YES\n");
return;
}
}
printf("NO\n");
}
int main(){
init();
return 0;
}
C
题意:
一个密码必须有数字,字母,符号。。给你几个字符串,可以左移或者右移这个字符串,问最后最少多少步能让所有字符串的首字母成为合法密码
tip:
找到每个数字。字母。符号需要移动的最少次少和第三少,这样就算都是一个字符串,也可以取到不同的字符串的最少。维护三小值
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef pair<int,int> pii;
int n,m,pos;
char s[60][60];
int szz[60],zmm[60],fhh[60],szmin,zmmin,fhmin;
pii sz[4],zm[4],fh[4];
void init(){
scanf("%d%d",&n,&m);
for(int i = 0 ; i <= n ; i++)
szz[i] = zmm[i] = fhh[i] = (1<<30);
for(int i = 1; i <= 3; i++)
sz[i].second = zm[i].second = fh[i].second = (1<<30);
for(int i = 1 ;i <= n; i++){
scanf("%s",s[i]);
for(int j = 0 ; j < m ; j++){
pos = min(j,m-j);
if(s[i][j] >= '0'&&s[i][j] <= '9') szz[i] = min(szz[i],pos);
else if(s[i][j] >= 'a' && s[i][j] <= 'z') zmm[i] = min(zmm[i],pos);
else if(s[i][j] == '#'||s[i][j] == '*'||s[i][j] == '&') fhh[i]= min(fhh[i],pos);
}
// printf("sz %d second = %d\n",szz[i],sz[3].second);
if(szz[i] < sz[3].second) sz[3].first=i,sz[3].second=szz[i];
if(szz[i] < sz[2].second) swap(sz[2],sz[3]);
if(szz[i] < sz[1].second) swap(sz[1],sz[2]);
if(zmm[i] < zm[3].second) zm[3].first=i,zm[3].second=zmm[i];
if(zmm[i] < zm[2].second) swap(zm[2],zm[3]);
if(zmm[i] < zm[1].second) swap(zm[1],zm[2]);
if(fhh[i] < fh[3].second) fh[3].first=i,fh[3].second=fhh[i];
if(fhh[i] < fh[2].second) swap(fh[2],fh[3]);
if(fhh[i] < fh[1].second) swap(fh[1],fh[2]);
}
int ans = (1<<30);
for(int i = 1; i <= 3; i++)
for(int j = 1; j <= 3; j++)
for(int k = 1; k <= 3; k++)
if(sz[i].first!=zm[j].first && zm[j].first != fh[k].first &&sz[i].first != fh[k].first && sz[i].second!=(1<<30) &&zm[j].second!=(1<<30)&&fh[k].second!=(1<<30))
ans = min(ans,sz[i].second+zm[j].second+fh[k].second);
printf("%d\n",ans);
}
int main(){
init();
return 0;
}
D题:
题意:
n是4个串长度,三个串满足关系: ci = bi - ai,p串是c串中每个数字在本串中是第几小的。。。现在给你p串和a串,问b串是否满足每个数字在l r 之间,且能让产生c串有p串的顺序
tip:
l- min(a[i])+a[i] <= b[i] <= r- max(a[i])+a[i]
满足这个左右关系就是可以的,每个bi都直接给左边或者右边
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,LL,RR,l,r;
const int maxn = 1e5+10;
int a[maxn],c[maxn];
void init(){
int minn = (1<<30);
int maxx = -(1<<30);
scanf("%d%d%d",&n,&l,&r);
for(int i = 1; i <= n ; i++)
scanf("%d",&a[i]);
for(int i = 1; i <= n ; i++){
int s;
scanf("%d",&s);
c[i] = n-s;
a[i] -= c[i];
minn = min(minn,a[i]);
maxx = max(maxx,a[i]);
}
if(l-minn <= r-maxx){
for(int i = 1; i <= n ; i++)
printf("%d ",l-minn+a[i]);
}
else
printf("-1\n");
}
int main(){
init();
return 0;
}