20级ACM集训队员【预选拔赛】——补题场(个人向)
附上比赛题目链接http://www.fjutacm.com/Contest.jsp?cid=940
先贴上AC了的题目,最后的G题就不贴了
A神奇的数字
Problem Description
有一种神奇的n位数,这种数满足以下全部条件:
1、每位上的数字都是0~9之间的数字,且不会重复出现
2、n位数不会由0开头,除非该n位数本身是0
3、任意两个相邻的位上组成的两位数都是非质数(允许两位数由0开头,比如08就是8)
tip:质数是指一个正整数只能被1和它本身整除(1不是质数)
Input
输入一个n,表示该神奇数的位数。(1≤n≤9)
Output
输出任意一个符合条件的神奇的数。
SampleInput And SampleOutput
NULL
说实话,A题,看到第一反应是就是直接莽就完事了。
/**
rid: 417421
user: zfordw
time: 2020-11-22 19:20:24
result: Accepted
*/
/*FJNU zfordw*/
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
if (n == 1)
{
printf("3");
}
if (n == 2)
{
printf("24");
}
if (n == 3)
{
printf("246");
}
if (n == 4)
{
printf("2468");
}
if (n == 5)
{
printf("24698");
}
if (n == 6)
{
printf("124698");
}
if (n == 7)
{
printf("1246398");
}
if (n == 8)
{
printf("12463985");
}
if (n == 9)
{
printf("127463985");
}
return 0;
}
后来想想,这个是原本的签到题,过了就好,滑稽保命。
下面是B题,不会,先贴题目,就跳过,以后再来
B 蝈蝈的字符串
Problem Description
蝈蝈有两个字符串S1,S2。S1->S2定义为S1在不改变原字符相对顺序的情况下任意删除字符使得剩下的字符串等于S2。现在蝈蝈想问你S1->S2是否成立。
Input
两行字符串,第一行字符串S1,第二行字符串S2。(1≤|S1|,|S2|≤1000)
两个给定字符串均只包括大小写字母。
Output
如果S1->S2成立,则输出"Yes";否则,输出"No"。
SampleInput
IDonnotLikeACM
ILikeACM
SampleOutput
Yes
然后是C题,说实话,C题我一开始是写了一半就跳过了的, 哎,蒟蒻一个。
C
Problem Description
输入一个日期,求经过n天之后的日期。
比如2020.1.1经过1天之后是2020.1.2。
闰年:当且仅当年份能被400整除 或者 能被4整除并且不能被100整除
闰年的二月有29天,平年有28天
Input
第一行输入一个日期,包括三个整数,年year(1≤year≤3000)、月month(1≤month≤12)、日day(1≤day≤31)。
第二行一个整数n,表示经过的天数。(1≤n≤1000)
保证输入的日期合法。
Output
输出三个整数,分别表示年、月、日。
SampleInput
2020 1 1
42
SampleOutput
2020 2 12
有一说一,一开始题目是没有给出闰年这方面的提示的。
/**
rid: 417717
user: zfordw
time: 2020-11-22 20:15:00
result: Accepted
*/
/*FJNU zfordw*/
#include<bits/stdc++.h>
using namespace std;
int d[2][13] = {
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31} };
int leap(int year)//判断闰年
{
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
return 1;
else
return 0;
}
int main()
{
int year, month, day, n, k;
scanf("%d%d%d", &year, &month, &day);
scanf("%d", &n);
day = day + n;
k = month;
for (; day > d[leap(year)][k]; k++)
{
day = day - d[leap(year)][k];
if (k == 12)
k = 0, year++;
}
month = k;
printf("%d %d %d", year, month, day);
return 0;
}
造轮子,用轮子,思路也挺中规中矩的,稍微改一下就是n天前的日期。
D 删掉,一定要删掉
Problem Description
diwa讨厌一个数组里有相邻或者重复的数字,上帝芃芃便赐予了diwa一种能力,每次使用这种能力,diwa都能从数组中任意选出两个不相等的下标i和j,如果x[i]和x[j]的差的绝对值不超过1,diwa便能删除两个数中较大的一个数,相同则可以删除任意一个数。在允许无限次使用能力的前提下,diwa想知道能不能让数组最后只剩一个元素。
Input
第一行输入一个n,表示数组的元素数量。(1≤n≤1000)
第二行输入n个整数,表示数组元素。(0≤ai≤100000)
Output
如果最后能只剩一个元素,则输出"Yes";否则,输出"No"。
SampleInput
5
1 2 3 3 4
SampleOutput
Yes
第一遍愣是没看懂题意,吐血。
我是用了排序,先把从小到大排起来,然后后一项去和前一项比,从小到大就去掉了题目里面那个绝对值了,小于1就把第i+1个等于第i个(~~不要问,为什么不直接删,我也想这样做啊,可惜是个蒟蒻。~~然后判断一下就可以了。好像最后写复杂了,不简洁了。等下次改一下 ,滑稽保命。
```c
/**
rid: 417572
user: zfordw
time: 2020-11-22 19:55:19
result: Accepted
*/
/*FJNU zfordw*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, i;
long long a[1005];
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
scanf("%lld", &a[i]);
}
sort(a+1, a + n+1);
for (i = n-1; i >= 1; i--)
{
if (a[i + 1] - a[i] <= 1)
{
a[i + 1] = a[i];
}
else {
printf("No");
return 0;
}
}
if (a[2]-a[1]<=1)
{
printf("Yes");
}
else
{
printf("No");
}
return 0;
}
最后的两题没过,真的awful,先分别贴一下题目,G题是真的放洪水,没什么好说的了。(我骗你的)
E 题
Problem Description
loop开始有n张牌,每张牌上都有一个编号,编号为1~n,每张牌的编号都不同。现在,loop每次将从这堆牌中拿出特定编号的牌,并放在牌堆顶。现在loop想考考你,如果loop将上述操作进行m次,则让你输出最后的牌序。
Input
第一行两个整数n和m,n表示牌的数量,m表示操作进行的次数。(1≤n,m≤200000)
第二行n个整数,为1~n的随机序列,且从前往后为从牌顶到牌底的顺序。
接下来有m行,每行一个整数k(1≤k≤n),表示每次取出的牌的编号。
Output
输出一行n个数,表示最后的牌的顺序,每个数后输出一个空格。
SampleInput
5 3
1 2 3 4 5
3
4
3
SampleOutput
3 4 1 2 5
--------------------------------------分割线------------------------------------------
F 题目是这样的:给你们一个数n,n是否可以被分成至少两个连续不重复的正整数,不可以的话输出“no”,否则输出连续正整数的最少个数。
例如:7可以分成(3,4),3和4是连续的,2个数已经是最少数量了所以答案为2个
9可以分成(4,5)或者(2,3,4),但是分成4,5个数最少,所以也是2个
4不可分成至少2个连续不重复的正整数,所以输出no。
Input
多组输入
每组输入一行包括一个数n(1<=n<=1000)
Output
每组数据输出一行
如果n可以按上述条件来分的话,输出最小不重复连续正整数个数,否则输出“no”(不要输出引号)
SampleInput
7
9
4
SampleOutput
2
2
no
第一次写题解博客,祝各位早日犇犇。
284



被折叠的 条评论
为什么被折叠?



