codeforces #394

166 篇文章 0 订阅
5 篇文章 0 订阅

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值