SDIBT_2018SummerVacationTraining_5

A 1015D

比赛的时候看的第一道题就是这道题,看完觉得很简单,但是感觉会写很久,就先跳过了,后来也没时间

补题的时候也卡了很久,也有很多特殊情况没考虑到//总之就是菜

题意大致是,给你n个房子,你需要移动k次来达到步数s,问每次移动到达的房子,每次移动你不能停留在原地

为什么会想到x=(ss-k)/(n-2)呢?每次移动最多能有(n-1)步,就是从第一个房子移动到最后一个房子,我想求出像这样的移动有几次,设x次,满足(n-1)*x+k-x=ss,然后就得到上面的式子,然后中间有k-x-1次移动是移动一步的,最后一次移动剩下的步数

中心思想就是....凑出来的≧0≦

是不是很呆,很呆就是了...

#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
ll s[200005];
int main()
{
    ll n,k,ss,i,x,xx,t;
    while(~scanf("%lld %lld %lld",&n,&k,&ss))
    {
        memset(s,0,sizeof(s));
        t=ss;
        if((ss<k)||((n-1)*k<ss))
        {
            printf("NO\n");//如果总移动距离小于移动的次数时或者移动的次数乘以(n-1)小于总的移动距离
        }
        else
        {
            if(n>2)
            x=(ss-k)/(n-2);
            else
            x=ss;//如果房子的数量等于2的时候,除以0,运行错误
            if(x==k)
            {
                for(i=1; i<=x; i++)
                {
                    if(i%2!=0)
                        s[i]=n;
                    else
                        s[i]=1;
                    ss-=(n-1);
                }
            }//当需要从第一个点移动到最后一点的次数等于需要移动的总次数时
            else
            {


                for(i=1; i<=x; i++)
                {
                    if(i%2!=0)
                        s[i]=n;
                    else
                        s[i]=1;
                    ss-=(n-1);
                }
                if(x==0)
                    s[1]=2;
                for(i=x+1; i<=k-1; i++)
                {
                    if(s[i-1]==n)
                    {
                        s[i]=n-1;
                    }
                    else if(s[i-1]==n-1)
                    {
                        s[i]=n;
                    }
                    else if(s[i-1]==1)
                    {
                        s[i]=2;
                    }
                    else if(s[i-1]==2)
                    {
                        s[i]=1;
                    }
                    ss-=1;
                }
                if(s[k-1]==1||s[k-1]==2)
                    s[k]=s[k-1]+ss;//倒数第二次的移动停留在1或2
                else if(s[k-1]==n-1||s[k-1]==n)
                    s[k]=s[k-1]-ss;//倒数第二次的移动停留在n或n-1
            }//需要从第一个房子移动到末尾的总次数加上剩下的次数从1到2或者从n到n-1,再加上最后一次的移动
            if(k==1)
                s[k]=t+1;//当移动的次数等于1的时候
                //这里卡了一次,是因为之前用ss+1,可是忘了ss在前面被减掉了
            printf("YES\n");
            for(i=1; i<=k; i++)
            {
                if(i!=k)
                    printf("%lld ",s[i]);
                else printf("%lld\n",s[i]);
            }
        }

    }
    return 0;
}

C877A

这道题也是卡了很久,以为很麻烦,要用到string里面不太熟悉的函数,结果一个多小时了,才想到还有愚笨的方法的

╯▂╰

#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
    int kk,k,i,t;
    char s[205];
    while(~scanf("%s",s))
    {
        k=strlen(s);
        t=0;
        for(i=0;i<k;i++)
        {
            if(s[i]=='A')
            {
                if(s[i+1]=='n'&&s[i+2]=='n')
                    t++;
            }
            else if(s[i]=='N')
            {
                if(s[i+1]=='i'&&s[i+2]=='k'&&s[i+3]=='i'&&s[i+4]=='t'&&s[i+5]=='a')
                    t++;
            }
            else if(s[i]=='S')
            {
                if(s[i+1]=='l'&&s[i+2]=='a'&&s[i+3]=='v'&&s[i+4]=='a')
                    t++;
            }
            else if(s[i]=='O')
            {
                if(s[i+1]=='l'&&s[i+2]=='y'&&s[i+3]=='a')
                    t++;
            }
            else if(s[i]=='D')
            {
                if(s[i+1]=='a'&&s[i+2]=='n'&&s[i+3]=='i'&&s[i+4]=='l')
                    t++;
            }
        }
        if(t==1)
            printf("YES\n");
        else
            printf("NO\n");

    }
    return 0;
}

D869B

比赛的时候卡了很久到最后也没出

补题的时候发现其实还是条件没考虑全(其实就是太菜o(╯□╰)o)

题意:给你两个数

贴上让自己看看是有多菜

#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
    ll a,b,t,tt,i;
    int t1,t2,t3,t4;
    while(~scanf("%lld %lld",&a,&b))
    {
        t=b-a;
        t1=a%10;
        t2=b%10;
        t3=(a/10)%10;
        t4=(b/10)%10;
//     printf("%d %d\n",t3,t4);
        if(t>=10||(t4!=t3))
        {
            printf("0\n");
        }
        else
        {
            if(t1<=2&&t2>=5)
                printf("0\n");
            else
            {
                tt=1;
                for(i=t1+1; i<=t2; i++)
                {
                    tt*=i;
                }
                printf("%lld\n",tt%10);
            }
        }
    }
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值