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进行降序排序
*/