程序设计竞赛"/>
弹指间计算机协会 2021“码拉松”程序设计竞赛
目录
- 1.HELLO UJSCODERS!
- 2.西瓜好坏
- 3.A+B
- 4.荒岛求生
- 5.筛选数字
- 6.逃离迷宫
- 7.星际穿越
1.HELLO UJSCODERS!
Description
输出“Hello UJScoders!”
Input
无
Output
输出“Hello UJScoders!”
Sample Input 1
无
Sample Output 1
Hello UJScoders!
题解
#include <iostream>
using namespace std;
int main()
{cout<<"Hello UJScoders!";return 0;
}
2.西瓜好坏
Description
大一的期末考试考完后,还不能直接回家。因为还有课程设计要做。
潘老师和曹老师买了 50000 50000 50000个西瓜,只知道其中的十几个西瓜是否为好瓜,剩下的西瓜的好坏无法判断。于是,潘老师和曹老师就通过那十几个已知好坏的西瓜,让同学们研究出一套方案,去判断剩下的西瓜是否为好瓜。
社长当年爆肝7天,终于将这套方案研究了出来。如图所示:
Input
一个西瓜的纹理、密度值、触感
Output
“好瓜”或“坏瓜”
Sample Input 1
清晰 0.4 硬滑
Sample Output 1
好瓜
题解
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
int main()
{string a;double b;string c;cin >> a >> b >> c;if (strcmp(a.c_str(), "清晰")==0){if (b <= 0.3185)cout << "坏瓜";elsecout << "好瓜";}else if (strcmp(a.c_str(), "稍糊")==0){if (strcmp(c.c_str(), "硬滑")==0)cout << "坏瓜";elsecout << "好瓜";}elsecout << "坏瓜";
}
3.A+B
Description
输入两个数 A A A和 B B B
输出它们的和 A + B A+B A+B
Input
两个整数, A A A和 B B B
Output
一个整数
Sample Input 1
1 1
Sample Output 1
2
Hint
人生苦短,我用python
题解
A,B = map(int, input().split())
C = A+B
print(C)
4.荒岛求生
Description
小明流落荒岛。荒岛的原始人已经会铸造硬币了,但原始人使用的货币只有两种面额。
例如,原始人使用的硬币只有3元和5元两种面额。
小明在购买货物的时候,只能用这两种面额的硬币。有的时候,小明付账不能被找钱结清,比如小明要买4元钱或7元钱的货物。事实上,最大的不能找钱结清的商品价格就是7元。大于等于8元钱的货物都能被3元和5元的硬币凑出来。
问:如果原始人只用A元和B元两种面额的硬币,最大的不能找钱结清的商品价格是多少?
Input
两个正整数,A和B
Output
一个正整数,代表结果
Sample Input 1
3 5
Sample Output 1
7
题解
a, b = (input().split())
a = int(a)
b = int(b)
print(a*b-a-b)
5.筛选数字
Description
我们通过一种办法筛选数字,被剩下的数被称为“存活数”。
首先从 1 1 1开始写出自然数 1 , 2 , 3 , 4 , 5 , 6 , . . . . 1,2,3,4,5,6,.... 1,2,3,4,5,6,....
1 1 1就是第一个“存活数”。
我们从 2 2 2这个数开始。把所有序号能被 2 2 2整除的项删除,数列变为:
1 _ 3 _ 5 _ 7 _ 9.... 1 \_ 3 \_ 5 \_ 7 \_ 9 .... 1_3_5_7_9....
重新记序:
135791113151719 1 3 5 7 9 11 13 15 17 19 135791113151719 。这时,3为第2个“存活数”,然后把所有能被3整除的序号位置的数删去。删除的数是 5 , 11 , 17 , . . . 5,11, 17, ... 5,11,17,...
数列又有变化:
137913151921252731333739 1 3 7 9 13 15 19 21 25 27 31 33 37 39 137913151921252731333739
此时 7 7 7为第 3 3 3个“存活数”,然后再删去序号位置能被 7 7 7整除的 ( 19 , 39 , . . . ) (19,39,...) (19,39,...)
最后剩下的数列类似:
1 , 3 , 7 , 9 , 13 , 15 , 21 1, 3, 7, 9, 13, 15, 21 1,3,7,9,13,15,21
Input
输入两个正整数 m n m n mn, 用空格分开 ( m < n < 1000 ∗ 1000 ) (m < n < 1000*1000) (m<n<1000∗1000)
Output
程序输出 位于 m m m和 n n n之间的存活数的个数(不包含 m m m和 n n n)。
Sample Input 1
120 1 20 120
Sample Output 1
5
题解
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN = 100001;
void rearrange(int* arr, int *arrdel,int &len) {int cur = 1;for (int i = 1; i <= len - 1; i++) {if (arrdel[i] == 0) {arr[cur] = arr[i];cur++;}}len = cur;memset(arrdel, 0, MAXN);
}
int main() {int m, n;int sum=0;cin >> m >> n;int arr[MAXN];int arrdel[MAXN];int len = MAXN;for (int i = 0; i <= MAXN; i++) {arr[i] = i;arrdel[i] = 0;}for (int i = 0; i <= MAXN / 2; i++) {arrdel[2 * i] = 1;}rearrange(arr, arrdel, len);for(int loop=2;loop<=n;loop++){int todel=arr[loop];for (int i = 1; i <= MAXN / todel; i++)arrdel[todel * i] = 1;rearrange(arr, arrdel, len);}for(int i=1;i<MAXN;i++)if(m<arr[i]&&arr[i]<n)sum++;cout<<sum;
}
6.逃离迷宫
Description
社长被困到了一个迷宫中。迷宫由 n n n行 m m m列的密室组成。
这些密室的编号就像矩阵的编号一样。如图所示
社长要逃离这个迷宫,就需要从左上角的 ( 1 , 1 ) (1,1) (1,1)号密室,走到 ( n , m ) (n,m) (n,m)号密室。
社长只能向右或者向下走。
注意,如果行号和列数都能被 3 3 3整除,则有机关陷阱!!!不能走入这一格中!
问社长有多少种办法可以逃离迷宫。
Input
两个整数 n n n和 m m m
Output
一个整数,代表社长能逃离迷宫的方案数目。
Sample Input 1
2 3
Sample Output 1
3
#include<iostream>
using namespace std;
int main()
{int n,m,map[100][100],i,j;cin>>n>>m;for (i=0;i<=n+1;i++)for (j=0;j<=m+1;j++){if (i==0||j==0) {map[i][j]=-1;}else{if (i%3==0&&j%3==0)map[i][j]=-1;elsemap[i][j]=0;}}for (i=1;i<=n;i++) map[i][1]=1;for (i=1;i<=m;i++)map[1][i]=1;for (i=2;i<=n;i++)for (j=2;j<=m;j++){if (map[i][j]!=-1){if (map[i-1][j]>0&&map[i][j-1]>0){map[i][j]=map[i-1][j]+map[i][j-1];}else{map[i][j]=map[i-1][j]+map[i][j-1]+1;}}}if (n%3==0&&m%3==0)cout<<0;else cout<<map[n][m];
}
7.星际穿越
Description
小明发明了宇宙飞船,可以进行星际穿越。每次航程都会从一个虫洞跃迁到另一个虫洞。
宇宙的所有虫洞围成了一个大圆圈,虫洞总数为 n n n,顺时针标序号为: 0 , 1 , 2 , . . . . . . n − 1 0,1,2,......n-1 0,1,2,......n−1,而宇宙飞船每次跃迁的距离为 d d d。例如,小明能从第 0 0 0个虫洞开始跃迁到第 d d d个虫洞而不能跃迁到这两个虫洞之间的任一虫洞。因为虫洞围成了一个圈,所以小明也可以从 n − 1 n-1 n−1号虫洞跃迁到 d − 1 d-1 d−1号虫洞,从 n − 2 n-2 n−2号虫洞跃迁到 d − 2 d-2 d−2号虫洞,以此类推。
现在小明所在的虫洞记为 x x x,而小明想去的虫洞在 y y y。
小明要跃迁多少次才能到达目的地?
注意:小明只能在顺时针方向上跃迁。
Input
输入多组测试数据。
第一行是一个整数 M M M,即:输入 M M M组测试数据。
接下来 M M M行,每行包括 4 4 4个数。分别为虫洞总总数量 n n n,跃迁的距离 d d d,小明的初始位置 x x x和小明的终点位置 y y y。
Output
对于每组测试数据,输出一行,给出小明至少跃迁多少次才能到达目的地。
如果无论翻跃迁多少次也不能到达,输出 Impossible。
Sample Input 1
2
3 2 0 2
3 2 0 1
Sample Output 1
1
2
#include<iostream>
using namespace std;
long long exgcd(long long a, long long b, long long& x, long long& y) {if (b == 0) {x = 1; y = 0;return a;}long long d = exgcd(b, a % b, y, x);y -= a / b * x;return d;
}
int main() {int t;cin >> t;while (t--) {long long n, d, x, y,a,b;cin >> n >> d >> x >> y;long long gcd = exgcd(n, d, a, b);if ((y - x) % gcd != 0) {cout << "Impossible" << endl;continue;}b = b * (y - x) / gcd;n = n / gcd;cout << ((b % n) + n) % n<<endl;}return 0;
}
更多推荐
弹指间计算机协会 2021“码拉松”程序设计竞赛
发布评论