题解-ACM2016级新生周赛(11.13)

A
选自2016ACM/ICPC亚洲区域赛-沈阳站

#include<stdio.h>
int max(int x,int y)
{
    if(x>y)
        return x;
    return y;
}
int min(int x,int y)
{
    if(x<y)
        return x;
    return y;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        printf("%d\n",max(a,b)*2+min(a,b));
    }
    return 0;
}

B
同A题 选自2016ACM/ICPC亚洲区域赛-沈阳站

#include<stdio.h>
#include<string.h>
#define maxn 15
int num(char c)
{
    if(c=='C')
        return 12;
    if(c=='O')
        return 16;
    return 1;
}
int main()
{
    char str[maxn];
    int T;
    scanf("%d",&T);
    while(T--)
    {
        memset(str,'\0',sizeof(str));
        scanf("%s",str);
        int sum=0;
        int len=strlen(str);
        for(int i=0; i<len; i++)
            sum+=num(str[i]);
        printf("%d\n",sum);
    }
    return 0;
}

C

#include<stdio.h>
#include<string.h>
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int a[26]= {0};
        char str[1005];
        scanf("%s",str);
        int len=strlen(str);
        for(int i=0; i<len; i++)
            a[str[i]-'a']++;
        int num=0;//记录次数
        for(int i=0; i<26; i++)
        {
            if(a[i]>a[num])
            {
                num=i;
            }
        }
        printf("%c %d\n",num+'a',a[num]);
        getchar();//吸收换行
    }
    return 0;
}

D

#include<stdio.h>
#include<string.h>
#define maxn 10005
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        char s1[maxn];
        scanf("%s",s1);
        int len=strlen(s1);
        int i;
        int num=0;
        for(i=0; i<len; i++)
        {
            if(s1[i]==s1[i+1])
            {
                num=1;
                while(s1[i]==s1[i+1]&&i<len-1)
                {
                    num++;
                    i++;
                }
                printf("%d%c",num,s1[i]);
            }
            else
                printf("%c",s1[i]);
        }
        printf("\n");
    }
    return 0;
}

E

#include<stdio.h>
#include<string.h>
#define maxn 100005
int main()
{
    char s1[maxn];//接收数据
    char s2[maxn];//接收处理过的字符串
    int len_s2=0;//s2的长度
    int num=0;//每行字符数量
    while(scanf("%s",s1)!=EOF)
    {
        if(strcmp(s1,"<br>")==0)//遇到就换一行
        {
            s2[len_s2++]='\n';
            num=0;//清空一行的字符数量
            continue;
        }
        else if(strcmp(s1,"<hr>")==0)//打印八十个字符
        {
            if(num!=0)
                s2[len_s2++]='\n';
            for(int i=0; i<80; i++)
                s2[len_s2++]='-';
            s2[len_s2++]='\n';
            num=0;//清空一行的字符数量
            continue;
        }
        int len_s1=strlen(s1);
        if(num+1+len_s1>80)//换行的第一个单词
        {
            s2[len_s2++]='\n';
            for(int i=0; i<len_s1; i++)
                s2[len_s2++]=s1[i];
            num=len_s1;
        }
        else//不换行的单词
        {
            if(num!=0)
                s2[len_s2++]=' ';

            for(int i=0; i<len_s1; i++)
                s2[len_s2++]=s1[i];
            num+=len_s1+1;
        }
    }
    for(int i=0; i<len_s2; i++)
        printf("%c",s2[i]);
    printf("\n");
    return 0;
}

F

#include<stdio.h>
#include<string.h>
char map_1[1005][105];//存储出现过的字符串
char map_2[1005][105];
int main()
{
    int T;
    scanf("%d",&T);
    for(int casen=1; casen<=T; casen++)
    {
        int len;
        scanf("%d",&len);//单个字符串长度
        char str_1[105];
        char str_2[105];
        char str_12[205];
        char str[205];//目标字符串
        scanf("%s%s%s",str_1,str_2,str_12);
        strcpy(str,str_12);//目标字符串存到str
        int steap=0;//需要多少步才能完成
        while(1)
        {
            strcpy(map_1[steap],str_1);
            strcpy(map_2[steap],str_2);//存储出现过的字符串
            for(int i=0,j=0; i<len; i++)
            {
                str_12[j++]=str_2[i];
                str_12[j++]=str_1[i];//获取拼接出来的字符串
            }
            steap++;//拼接操作次数加一
            if(strcmp(str,str_12)==0)
            {
                printf("%d ",casen);
                printf("%d\n",steap);
                break;//拼接出来的字符串和目标字符串相等
            }
            for(int i=0; i<len; i++)
                str_1[i]=str_12[i];//获取新的字符串1
            for(int i=len,j=0; i<len*2; i++,j++)
                str_2[j]=str_12[i];//获取新的字符串2
            bool is_break=0;//需要时就置为1
            for(int i=0; i<steap; i++)//检测新的字符串1是否出现过
                if(strcmp(map_1[i],str_1)==0)
                {
                    printf("%d ",casen);
                    printf("-1\n");
                    is_break=1;
                    break;
                }
            if(is_break==1)
                break;
            for(int i=0; i<steap; i++)//检测新的字符串2是否出现过
                if(strcmp(map_2[i],str_2)==0)
                {
                    printf("%d ",casen);
                    printf("-1\n");
                    is_break=1;
                    break;
                }
            if(is_break==1)
                break;
        }
    }
    return 0;
}

G
听说这是一个斐波那契数列(然而我并没看出来)

我得到的规律:2→3,3→3+2;
就这样一直递归可以得到答案

#include<stdio.h>
#include<string.h>
//2-3,3-3+2
int main()
{
    int num[21];
    int len=6;
    num[0]=0;
    num[1]=1;
    num[2]=2;
    num[3]=3;
    num[4]=5;
    num[5]=8;
    int num_3=3;
    int num_2=2;
    while(len<=20)
    {
        num[len]=num_2*2+num_3*3;
        int flag=num_3;
        num_3=num_2+num_3;
        num_2=flag;
        len++;
    }
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int N;
        scanf("%d",&N);
        printf("%d\n",num[N]);
    }
    return 0;
}

H
注意数据精度

#include<string.h>
#include<stdio.h>
#include<math.h>
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;//n组数据
        scanf("%d",&n);
        double num[2][105];//存储坐标
        for(int i=0; i<n; i++)
            scanf("%lf%lf",&num[0][i],&num[1][i]);//存储xy坐标
        double a,b,c;//三角形三条边
        int sum=0;//记录总数
        int i,j,k;
        for(i=0; i<n-2; i++)
            for(j=i+1; j<n-1; j++)
                for(k=j+1; k<n; k++)
                {
                    a=sqrt((num[0][i]-num[0][j])*(num[0][i]-num[0][j])+(num[1][i]-num[1][j])*(num[1][i]-num[1][j]));
                    b=sqrt((num[0][i]-num[0][k])*(num[0][i]-num[0][k])+(num[1][i]-num[1][k])*(num[1][i]-num[1][k]));
                    c=sqrt((num[0][k]-num[0][j])*(num[0][k]-num[0][j])+(num[1][k]-num[1][j])*(num[1][k]-num[1][j]));
                    if(a*a+b*b>c*c&&a*a+c*c>b*b&&b*b+c*c>a*a)
                        sum++;
                }
        printf("%d\n",sum);
    }
    return 0;
}

I
请学会使用sort函数

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
struct node
{
    int left;
    int right;
}num[105];
bool cmp(node x,node y)
{
    return x.right<y.right;
}
int main()
{
    int N;
    while(~scanf("%d",&N)&&N)
    {
        for(int i=0;i<N;i++)
            scanf("%d%d",&num[i].left,&num[i].right);
        sort(num,num+N,cmp);
        int sum=0;//节目数量
        int right=-1;//右边界
        int i;
        for(i=0;i<N;i++)
        {
            if(num[i].left>=right)
            {
                sum++;
                right=num[i].right;//更新右边界
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

J
接收数据时实时更新每个拦截系统所能拦截的最大高度,如果所有拦截系统都无法拦截,就新开一个拦截系统

#include<stdio.h>
#include<string.h>
#include<math.h>
const int maxn=30005;
int main()
{
    int N;
    while(~scanf("%d",&N))
    {
        int num[10000];
        num[0]=maxn;
        int result=0;
        for(int i=0;i<N;i++)
        {
            int flag;
            scanf("%d",&flag);
            bool is_ok=0;
            for(int j=0;j<=result;j++)
            {
                if(num[j]>flag)
                {
                    num[j]=flag;
                    is_ok=1;
                    break;
                }
            }
            if(is_ok==0)
            {
                result++;
                num[result]=flag;
            }
        }
        printf("%d\n",result+1);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值