BUU-ACM国庆新人欢乐赛题解

A

模拟签到题
判断平年还是闰年,然后输出365、366即可。

code
#include <stdio.h>
int main()
{
    int x;
    scanf("%d", &x);
    if (x % 400 == 0 || (x % 100 != 0 && x % 4 == 0)) {
        printf("366");
    } else {
        printf("365");
    }

    return 0;
}

B

题意

即有多少种构造方法,能够组成一个n位的幸运数字。

每一位要么是6要么是8,所以答案是 2 n 2^n 2n

code
#include <math.h>
#include <stdio.h>
int main()
{
    int n;
    scanf("%d", &n);
    printf("%.0lf", pow(2, n));
    return 0;
}

C

题意

当n为偶数时,毫无疑问可以一下取完。当n为奇数时,无论怎么取都会剩下一个奇数,使得对手可以一次下取完,所以判断n的奇偶性就可以。

code
#include <stdio.h>

int main()
{
    int t;
    scanf("%d", &t);
    while (t--) {
        int n;
        scanf("%d", &n);
        if (!(n & 1) ) {
            printf("Happy Valley!\n");
        } else {
            printf("No!!!!\n");
        }
    }

    return 0;
}

D

题意

这是一道思维构造题,本以为难度在这场比赛为中等梯度,结果全场没有人开这道题。。。。
这类题目在icpc和codeforce中非常常见。

x是 小于等于a,b的最大整数,即是ab的最大公因数,x = gcd(a,b)。

即,构造一个a,b,x = gcd(a,b)。 使得 a,b,x 都在(L,R)内。

首先考虑x,x如果在LR范围内,那么a,b的取值范围是多少?
显然 a = k1 * x; b = k2 * x; (k1 != k2 且 k1,k2 ∈[0,正无穷] )
首先我们可以令k1 等于 1.那么 a == x, a满足在(L,R)内的条件.
那么对于b, 因为 k2 等于 1的时候已经符合条件了, 那么显然可以证明 k2 取 2 时是最符合条件的.
因为 x > L,那么 x 取 L + 1 时存在解的情况更多.
得其中一种构造方式, x = a = L + 1 , b = 2 * x

对于无解的情况
只需要判断 2*x 是否大于等于 R即可,如果是,则无解.

#include <stdio.h>
int main()
{
    int l, r;
    scanf("%d%d",&l,&r);
    int a = l + 1;
    int b = (l + 1) * 2;
    if (b > r) {
        printf("-1");
    } else {
        printf("%d %d %d", a, b, a);
    }

    return 0;
}

E

题意

分数化简,很明显只要求出两个数的最大公约数就行。比赛中没有卡暴力的写法,正解应该是gcd辗转相除法求gcd,复杂度logn

暴力做法

#include<stdio.h>
int main()
{
	int m,n,i;
	scanf("%d%d",&m,&n);
	for(i=m;i>=1;i--)
	{
		if((m%i==0)&&(n%i==0))
		{
			m=m/i;
			n=n/i;
			break;
		}
	}
	printf("%d %d",m,n);
	return 0;
}

欧几里得辗转相除法做法

#include<iostream>
#include<cstdio>
#include<cstring> 
#include<string>
using namespace std;
int gcd(int a,int b)
{
	if(b==0)
	return a;
	else
	return gcd(b,a%b);
}
int main()
{
	int a,b;
	cin>>a>>b;
	cout<<a/gcd(a,b)<<" "<<b/gcd(a,b);
	return 0;
}

F

题意

字符串模拟,主要考察字符串处理能力。
观察大家WA的常见错误:
1.数组越界 s[100]只能存储0-99的字符,所以第100字符无法存储
2.c语言读入无空格字符串应用scanf("%s",s);

#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
using namespace std;
char s[105];
int main()
{
	scanf("%s",s);
	int len = strlen(s);
	for(int i=0;i<len;i++)
	{
		if(s[i]<='z'&&s[i]>='a')
		{
			printf("%c",s[i]-'a'+'A');
		}
		if(s[i]<='Z'&&s[i]>='A')
		{
			printf("%c",s[i]-'A'+'a');
		}
		if(s[i]=='#')
		{
			printf("^.^");
		}
	}
	return 0;
}

G

题意

贪心+stl自定义排序的应用,根据题意,很明显用时越少的题目应越早尽快解决,这样才能使得用时长的题目所拖延的时间尽可能少,总时间尽可能少。由于数值相同的要根据输入顺序先后输出,所以我们还要自定义排序,排序后才能输出答案。

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;

int n;
double sum;
struct stu
{
    int t;
    int id;
};
stu s[1005];

bool cmp(stu x,stu y)
{
  	if (x.t == y.t)
		return x.id < y.id; 
   return x.t < y.t;
}

int main(){
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        s[i].id = i;
        cin >> s[i].t;
    }
    sort(s + 1, s + n + 1,cmp);
    for (int i = 1; i <= n; i++)
    {
        cout << s[i].id << " " ;
    }
    //cout << endl;
    return 0;
}

/*
	构建一个同时含有输入id和解题时常的结构体
	并对他们进行排序,先按照时间进行升序排序
	如果时间相同,则按照输入id进行降序排序
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值