菜鸡的代码大佬勿喷
注:不一定是最优解嗷,懒得改了/捂脸
A. 走楼梯
运行时间限制: 1000 | 运行内存限制: 65536 |
作者: scshuanghai | 是否specialjudge: False |
题目描述
假设一段楼梯共n(0 < n < 100) 个台阶,小明一步最多能上3 个台阶。编写程序计算小明上这段楼梯一共有多少种走法。
样例解释:1、可以一步走3个台阶;2、可以先走1个台阶,然后一步走2个台阶;3、可以先走2个台阶,然后走1个台阶;4、可以每步都走1个台阶,走3步。所以共有4种走法。
输入:为一个整数n(0 < n < 100 ) 。
输出:也为一个整数,代表走法的数量。测试用例保证输入合法且所有整数均可以用long long 存储。
输入样例
3
输出样例
4
示例代码
正解(迭代):
#include <stdio.h>
int main()
{
long long int n;
long long int count = 0;
scanf("%lld", &n);
long long int a = 1, b = 2, c = 4;
if (n == 1)
{
count = 1;
}
else if (n == 2)
{
count = 2;
}
else if (n == 3)
{
count = 4;
}
else
{
long long int tmp = 0;
for (int i = 4; i <= n; i++)
{
tmp = a + b + c;
a = b;
b = c;
c = tmp;
}
count = tmp;
}
printf("%lld", count);
return 0;
}
记忆化搜索(用了数组没分):
#include <stdio.h>
long long int f(long long int);
long long int ans[102] = {0};
int main()
{
long long int n;
scanf("%lld", &n);
printf("%lld", f(n));
return 0;
}
long long int f(long long int i)
{
if (ans[i] != 0)
{
return ans[i];
}
if (i == 1)
{
return 1;
}
if (i == 2)
{
return 2;
}
if (i == 3)
{
return 4;
}
else
{
ans[i] = f(i - 1) + f(i - 2) + f(i - 3);
return ans[i];
}
}
B. 分球
运行时间限制: 1000 | 运行内存限制: 65536 |
作者: scshuanghai | 是否specialjudge: False |
题目描述
现有n个小球,要把它们分给3个人,如果每人至少分m个,问共有多少种分法。
样例解释:共有(3,3 ,6)、(3, 4 ,5)和(4,4,4)三种分法。
输入:为两个用空格分隔的整数n(1<n),m(0<m)。
输出:为一个整数,代表分法的数量。测试用例保证输入合法,分法至少有1种,且均所有整数均可以用int存储。
输入样例
12 3
输出样例
3
示例代码
#include<stdio.h>
int main()
{
int n, m;
scanf("%d %d", &n, &m);
int a, b, c;
int count = 0;
for (a = m; a <= n - 2 * m; a++)
{
for (b = a; b <= n - 2 * m; b++)
{
for (c = b; c <= n - 2 * m; c++)
{
if (a + b + c == n)
{
count++;
}
}
}
}
printf("%d", count);
}
C. 逆数求和
运行时间限制: 1000 | 运行内存限制: 65536 |
作者: scshuanghai | 是否specialjudge: False |
题目描述
整数的“逆数”指的是把该整数的每一位数字的顺序颠倒过来所得到的另一个整数。如果一个整数的末尾是以0,那么在它的逆数当中,这些0就被省略掉了。比如说,1245的逆数是 5421,而1200的逆数是21。请编写一个程序,输入两个整数,然后计算这两个整数的逆数之和sum,然后再把sum的逆数计算出来。
输入:只有一行,包括两个整数,中间用空格隔开。
输出:共三行,即相应的结果。具体格式见输出样例。测试用例保证输入合法,且所有整数均可以用int存储。
输入样例
123 456
输出样例
reverse(123)=321
reverse(456)=654
reverse(sum)=579
示例代码
#include<stdio.h>
int reverse(int);
int main()
{
int a, b;
scanf("%d %d", &a, &b);
printf("reverse(%d)=%d\n", a, reverse(a));
printf("reverse(%d)=%d\n", b, reverse(b));
printf("reverse(sum)=%d", reverse(reverse(a) + reverse(b)));
return 0;
}
int reverse(int i)
{
int n = i;
int hou = 0;
while (i != 0)
{
hou = hou * 10;
hou = hou + i % 10;
i = i / 10;
}
return hou;
}
D. 多少个一
运行时间限制: 1000 | 运行内存限制: 65536 |
作者: scshuanghai | 是否specialjudge: False |
题目描述
给定一个整数n(0 < n < 10000 ),如果n不能被2或5整除,那么n的某个倍数一定由若干个1组成。请写程序计算出最小的这样的倍数的位数。
注意:从逻辑上讲,最小的这样的倍数是可能超过long long 的存储范围的,但我们的测试用例保证没有这样的测试数据。
样例解释:最小的这样的倍数为111。
输入:只有一整数代表n。
输出:也只有一个整数,为计算结果。
输入样例
3
输出样例
3
示例代码
#include<stdio.h>
int main()
{
long long int n;
scanf("%lld", &n);
if (n % 2 != 0 && n % 5 != 0)
{
long long int i = 1;
int count = 1;
while (i % n != 0 && i > 0)
{
i = i * 10 + 1;
count++;
}
printf("%d\n", count);
}
else
{
printf("0\n");
}
return 0;
}
E. 玩游戏二
运行时间限制: 1000 | 运行内存限制: 65536 |
作者: scshuanghai | 是否specialjudge: False |
题目描述
你正在玩某款流行游戏,在游戏中你操纵的角色从天而降,来到一个二维地图的中心。地图同生活中的地图类似也是上北下南左西右东。你可以用三个键来控制这个角色在地图上行走,你按1,角色向前走,你按2,角色向右走(同时转向右边),你按3,角色向左走(同时转向左边)。我们假设1、你每按一个数字角色在地图上行走的距离是一样的;2、你刚刚降落到地图上时是面朝西的。那么请你写一段程序来判断若干次操作后,角色所在的位置相对于出发点(角色刚刚降落到地图时的位置)位置的方位。
输入:只有一行仅由1,2或3组成的字符串(以’\n’结束),依次代表你按下的键。
输出:只有一行,为一个字母或两个字母的组合,代表最终地点相对于出发地的方位(用英文字母eswn,分别代表东南西北)。如果需要输出两个字母,则输出字母按照字典序输出,比如es代表东南。
测试用例保证合法,且没有最终又回到原始出发点的情况。
输入样例
31
输出样例
s
示例代码
#include<stdio.h>
int main()
{
char d;
int x = 0, y = 0;
scanf("%c", &d);
int state = 2; //north 1, south 3, west 2, east 4
while (d != '\n')
{
if (d - '0' == 2)
{
state = state - 1;
}
if (d - '0' == 3)
{
state = state + 1;
}
while (state > 4)
{
state = state - 4;
}
while (state <= 0)
{
state = state + 4;
}
if (state == 1)
{
y = y + 1;
}
if (state == 2)
{
x = x - 1;
}
if (state == 3)
{
y = y - 1;
}
if (state == 4)
{
x = x + 1;
}
scanf("%c", &d);
}
if (x > 0)
{
if (y > 0)
{
printf("en");
}
else if (y < 0)
{
printf("es");
}
else
{
printf("e");
}
}
else if (x < 0)
{
if (y > 0)
{
printf("nw");
}
else if (y < 0)
{
printf("sw");
}
else
{
printf("w");
}
}
else if (y > 0)
{
printf("n");
}
else if (y < 0)
{
printf("s");
}
return 0;
}