Codeforces Round #394 (Div. 2)(A. Dasha and Stairs,B. Dasha and friends,C. Dasha and Password)

题目链接
因为技术问题,这round排名崩了不算分,那就先来更新ABC题吧

A. Dasha and Stairs
很多人被hacked应该是没有考虑a、b同时为0的情况,我也没注意啊

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 100050;
typedef long long int ll;
int san[250],ke[250];
int main()
{
    int a,b;
    cin>>a>>b;
    int ok = 1;
    if(abs(a-b)>1)ok = 0;
    else ok = 1;
    if(a==0 && b==0)ok = 0;
    if(ok)printf("YES\n");
    else printf("NO\n");
    return 0;
}

B. Dasha and friends
这题数据太弱了,以至于可以用枚举来解决,是一道很好的思路题,官方还没更题解,也还没看大神的代码,两个人起点的距离范围肯定在[-L,L],通过距离修正坐标,然后排序再进行匹配,很蠢的方法,不过数据这么小这样做能过
先贴我AC的代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 100050;
typedef long long int ll;
int san[250],ke[250];
int main()
{
    int n,L;
    cin>>n>>L;
    for(int i=0;i<n;++i)cin>>ke[i];
    for(int i=0;i<n;++i)cin>>san[i];

    sort(ke,ke+n);
    sort(san,san+n);
    int ok = 0,t = 0,juli = maxn;
    for(juli = -L;juli <= L;++juli)
    {
        int a[250];
        for(int i=0;i<n;++i)a[i] = (ke[i] + juli) % L;
        sort(a,a+n);    
        ok = 1;
        for(int i=0;i<n;++i)
        {
        //  printf("%d ",a[i]);
            if(a[i]!=san[i]){
                ok=0;//break;
            }
        }
        if(ok){printf("YES\n");return 0;}
    }
     printf("NO\n");
    return 0;
}

C. Dasha and Password
直接开数组存,每组存下三个值,n组字符串,每组拿到字符,数字,符号需要的最小次数,数据这么弱直接三重循环枚举更新答案

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <queue>
using namespace std;
const int maxn = 1000050;
typedef long long int ll;
char s[70][150];
int mval[70][3];
int main()
{
//  freopen("in.txt","r",stdin);
    int n,m;
    scanf("%d %d",&n,&m);
    for(int i=0;i<n;++i)
    scanf("%s",s[i]);
    for(int i=0;i<70;++i)
        mval[i][0]= mval[i][1]= mval[i][2] = maxn;
    for(int i=0;i<n;++i)
    {
        for(int j=0;j<m;++j)
        {
        if(s[i][j]=='#' || s[i][j]=='*' || s[i][j]=='&')
            mval[i][2] = min( min(j,m-j),mval[i][2]);
        else if(s[i][j]<='9' && s[i][j]>='0')
            mval[i][0] = min( min(j,m-j),mval[i][0]);
        else if(s[i][j]<='z' && s[i][j]>='a')
            mval[i][1] = min( min(j,m-j),mval[i][1]);
        }
    }
//  for(int i=0;i<n;++i)
//  printf("%d %d %d\n",mval[i][0],mval[i][1],mval[i][2]);

    int ans = 1e9;
    for(int i=0;i<n;++i)
    {
        for(int j=0;j<n;++j)
        {
            if(i==j)continue;
            for(int k=0;k<n;++k)
            {
                if(i==k || j==k)continue;
                ans = min(ans,mval[i][0]+mval[j][1]+mval[k][2]);
                ans = min(ans,mval[i][0]+mval[j][2]+mval[k][1]);

                ans = min(ans,mval[i][1]+mval[j][0]+mval[k][2]);
                ans = min(ans,mval[i][1]+mval[j][2]+mval[k][0]);

                ans = min(ans,mval[i][2]+mval[j][0]+mval[k][1]);
                ans = min(ans,mval[i][2]+mval[j][1]+mval[k][0]);
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值