17暑假预热赛--SDIBTVJ1793

我的心愿是世界和平!

题目来源:http://acm.sdibt.edu.cn:8080/vjudge/contest/view.action?cid=1793#overview

A : Which Base is it Anyway?

假设该数字为八进制、十进制、十六进制数,求其转换为十进制数后的大小。

#include<stdio.h>
#include<string.h>
char s[10];
int main()
{
    int m,k,i;
    scanf("%d",&m);
    while(m--)
    {
        int n=0,p=0,q=0,t;
        scanf("%d%s",&k,s);
        for(i=0; i<strlen(s)-1; i++)
        {
            if(s[i]-'0'>=8)//**若该数字大于八,它不是八进制数**
            {
                n=0;
                break;
            }
            t=s[i]-'0';
            n=(n+t)*8;
        }
        if(s[i]-'0'>=8)
            n=0;
        else
        {
            t=s[i]-'0';
            n=n+t;
        }
        for(i=0; i<strlen(s)-1; i++)
        {
            t=s[i]-'0';
            p=(p+t)*10;
        }
        t=s[i]-'0';
        p=p+t;
        for(i=0; i<strlen(s)-1; i++)
        {
            t=s[i]-'0';
            q=(q+t)*16;
        }
        t=s[i]-'0';
        q=q+t;
        printf("%d %d %d %d\n",k,n,p,q);
    }
    return 0;
}

B : DA-Sort

选一个数字将其删除并接入队尾,使其从小到大排列,求最少移动数字。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int s[1011];
int a[1011];
int main()
{
    int i,m,n,k;
    scanf("%d",&m);
    while(m--)
    {
        int sum=0;
        scanf("%d%d",&k,&n);
        for(i=0;i<n;i++)
        {
            scanf("%d",&s[i]);
            a[i]=s[i];
        }
        sort(a,a+n);
        for(i=0;i<n;i++)
        {
            if(s[i]==a[sum])
            {
                sum++;
            }
        }
        printf("%d %d\n",k,n-sum);
    }
    return 0;
}

C : A Rational Sequence

首为1/1,接下来左为p/(p+q),右为(p+q)/q,求他的位置。

#include<stdio.h>
long long int s[1000000];
int main()
{
    long long int m,k,a,b;
    char c;
    scanf("%lld",&m);
    while(m--)
    {
        long long int sum=1;
        scanf("%lld%lld%c%lld",&k,&a,&c,&b);
        long long int i=-1;
        while(1)
        {
            if(a>b)//**右孩子**
            {
                s[++i]=1;
                a=a-b;
            }
            if(a<b)//**左孩子**
            {
                s[++i]=0;
                b=b-a;
            }
            if(a==b)//**首部**
            {
                break;
            }
        }
        for(;i>=0;i--)
        {
            sum=sum*2+s[i];//**利用二叉树的规律**
        }
        printf("%lld %lld\n",k,sum);
    }
    return 0;
}

D : Alphabet

给定一字符串,在其任一位置删除字母或添加字母,求其最少添加字母的数量。

#include<stdio.h>
#include<string.h>
char s[55];
int a[55];
int main()
{
    int i,j;
    while(~scanf("%s",s))
    {
        int max=0,sum=0;
        for(i=0;i<=54;i++)
            a[i]=1;
        for(i=0;i<strlen(s);i++)//**求最长上升子序列**
        {
            max=0;
            for(j=0;j<i;j++)
            {
                if(s[i]>s[j])
                {
                    if(max<a[j])
                        max=a[j];
                }
            }
            a[i]=a[i]+max;
            if(sum<a[i])
                sum=a[i];
        }
        printf("%d\n",26-sum);
    }
    return 0;
}

E : Classy

upper>middle>lower,从后向前比较,更大的名字在前面,若不足,则添middle,若均相同,按名字顺序排列。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char b[270];
struct person
{
    char per[50];
    int a[50];
} s[1010];
int cmp(const void *a,const void *b)
{
    int i;
    struct person *c=(person *)a;
    struct person *d=(person *)b;
    for(i=49; i>=0;)
    {
        if(d->a[i]!=c->a[i])
            return d->a[i]-c->a[i];
        else
            i--;
    }
    return strcmp((char *)c->per,(char *)d->per);
}
int main()
{
    int i,j,m,t;
    while(~scanf("%d",&m))
    {
        for(i=0; i<=1000; i++)
            for(j=0; j<=49; j++)
                s[i].a[j]=2;
        getchar();
        for(i=0; i<m; i++)
        {
            gets(b);
            t=-1;
            int suan=49;
            for(j=0; j<strlen(b); j++)
                if(b[j]==' ')
                    t++;
            for(j=0; j<strlen(b); j++)
            {
                if(b[j]==':')
                {
                    s[i].per[j]='\0';
                    break;
                }
                else
                    s[i].per[j]=b[j];
            }
            suan-=t;
            for(j=strlen(s[i].per); j<strlen(b); j++)
            {
                if(b[j]==' ');
                else
                {
                    if(b[j]=='u')
                    {
                        s[i].a[++suan]=3;
                        j+=5;
                    }
                    else if(b[j]=='m')
                    {
                        s[i].a[++suan]=2;
                        j+=6;
                    }
                    else if(b[j]=='l')
                    {
                        s[i].a[++suan]=1;
                        j+=5;
                    }
                    if(b[j]=='c')
                        break;
                }
            }
        }
        qsort(s,m,sizeof(s[0]),cmp);
        for(i=0; i<m; i++)
        {
            printf("%s\n",s[i].per);
        }
        printf("\n");
    }
}

F : Euclid’s Game

博弈,用大的数字减小的数字,若有倍数,可减任意倍,Stan优先进行,谁先减到0谁赢。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    int m,n;
    while(scanf("%d%d",&m,&n))
    {
        if(m==0&&n==0)
            break;
        int sum=0;
        while(1)
        {
            if(m-n>=n||n-m>=m)//**可控制接下来的顺序**
            {
                sum++;
                break;
            }
            if(m>=n)
                m-=n;
            else
                n-=m;
            sum++;
            if(m==0||n==0)
                break;
        }
        if(sum%2==0)
            printf("Ollie wins\n");
        else
            printf("Stan wins\n");
    }
    return 0;
}

G : Six Sides

丢骰子,求赢的概率。

#include<stdio.h>
int a[6];
int b[6];
int main()
{
    int i,j;
    while(~scanf("%d",&a[0]))
    {
        double m=0.0;
        for(i=1;i<=5;i++)
            scanf("%d",&a[i]);
        for(i=0;i<=5;i++)
            scanf("%d",&b[i]);
        int sum=0,t=0;
        for(i=0;i<=5;i++)
        {
            for(j=0;j<=5;j++)
            {
                if(a[i]>b[j])
                    sum++;
                else if(a[i]==b[j])
                    t++;
            }
        }
        if(t==36)
            printf("0.00000\n");
        else
        {
            m=sum*1.0/(36-t);
            printf("%.5lf\n",m);
        }
    }
}

H : acm实验室里的故事

三个矩形可否构成正方形。

#include<stdio.h>
int main()
{
    int m,n,p,q,x,y,t;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        scanf("%d%d%d%d",&p,&q,&x,&y);
        if(m<n)
        {
            t=m;m=n;n=t;
        }
        if(p<q)
        {
            t=p;p=q;q=t;
        }
        if(x<y)
        {
            t=x;x=y;y=t;
        }
        if(m<x)
        {
            t=m;m=x;x=t;
            t=n;n=y;y=t;
        }
        if(m<p)
        {
            t=m;m=p;p=t;
            t=n;n=q;q=t;
        }
        t=0;
        if(m==p&&p==x)//**边长为m的正方形**
        {
            if(m==n+y+q)
                t=1;
        }
        if(m==p+x)//**接下来类似的四种正方形**
        {
            if(q==y&&n+q==m)
                t=1;
        }
        if(m==q+y)
        {
            if(p==x&&n+p==m)
                t=1;
        }
        if(m==q+x)
        {
            if(p==y&&n+p==m)
                t=1;
        }
        if(m==p+y)
        {
            if(q==x&&n+q==m)
                t=1;
        }
        if(t==1)
            printf("YES\n");
        else
            printf("NO\n");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值