7道水题
1:
解决NPC问题 15’
描述
时光飞逝,还没来得及放松,假期就要结束了~
zzzzzZZZZZ…
Laofu睡着正香,做起了美梦~
Laofu来到了minecraft游戏世界,接到了第一个他的第一个NPC任务,任务如下:
已知今年是某某年,该年的第300天是星期二,明年(某某年的下一年)的第200天还是星期二,请计算出去年(某某年的前一年)年的第100天是星期几?
当然,这个游戏世界中的时间计算方式和我们真实生活中的时间是一样的,也有闰年,平年,大小月~
请你帮助Laofu解决这个NPC问题~ 并提交答案,星期一至星期天依次对应(1~7)
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数(1~7),在提交答案时只填写这个数字,填写多余的内容将无法得分。
答案: 4
思路:
方法一:枚举年份,找满足题目所有条件的相邻三年。
方法二:我们可以根据给定的天数推理出中间这一年就是闰年的。假设中间年份是x年,第300天是星期二,第x+1年的第200天也是星期二。中间间隔天数一定是7倍数.两个星期二中间间隔天数为65+200或66+200天,只有266才是7的倍数,也就是说第x年时是闰年。所以第x−1年的100天到第x年的300天,总共间隔565天。556%7 = 5。即求星期几过5天是星期二,显然星期四咯~ 是不是很懒~
写到这里,笔者流下了不争气的眼泪。难道我付某人只会做做这样的水题吗?????我不 我不 我不 !!!!!!!!!!!!
2:
可爱的倍数 5’
描述
Laofu手里有1,2,3…200共200张卡片。
现在他想挑出尽可能多的卡片,使得挑出的卡片中不存在一个数是另一个数的倍数。
你需要帮他算出最多能拿出的卡片。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个数字,填写多余的内容将无法得分。
答案:100。
思路:
假设我们拿的卡片最小是x 且x<100,那么显然 2x 、3x···4*x 我们都不能再拿了。而我们在100到200之间总能找到x的倍数。我们会发现当x的倍数大于100并且小于200时,因为我们拿了这个小于100的数,导致我们会有好几个大于100的数和小于100的数不能再拿了。拿一个数造成的损失会很大,显然得不偿失。而当我们拿的最小的x是大于100的时候,会发现在200以内,不会有比它大的倍数,所有大于100的数之间不存在倍数关系。so 挑101-200对应的卡片即可。
3:
可爱的志数 8’
描述
Laofu梦想成为一名数学家,现在他准备命名一类数叫做志数。
他认为,如果一个数的约数个数小于等于3,那么这种数称为志数。
例如:4就是一个志数,6就不是一个志数
现在,他想知道:1到200328中,有多少志数?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个数字,填写多余的内容将无法得分。
**注意:**求约数时尽量不要使用o(n)的算法。
答案:18097。
代码:
#include <stdio.h>
int ans;
int zhi(int x)
{
int s=0;
for(int i=1;i*i<=x;i++)
{
if(x%i)
{
continue;
}
if(x%i==0&&i*i!=x)
{
s+=2;
}
else
{
s++;
}
if(s>3) return 0;
}
return 1;
}
int main()
{
for(int i=1;i<=200328;i++)
{
if(zhi(i))
{
ans++;
}
}
printf("%d",ans);
return 0;
}
4:
斐波那契数列 10’
描述
已知斐波那契数列 1,1,2,3,5,8,13,211,1,2,3,5,8,13,21, 每一项是前两项的和。
请告诉Laofu,第202003281331项的最后一位是多少。(大家写到这题,是不是这个时间呢,嘿嘿~)
例如:第八项的最后一位是1
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个数字,填写多余的内容将无法得分。
答案:9。
思路:矩阵乘法可以解决,但是完全没必要。最后一位的结果,只和最后一位有关,所以我们只处理最后一位即可。然而题目给的数据有点变态,代码跑了好几分钟也跑不出来结果。最后把每次的值都打印出来,发现存在规律。打印了前300项发现每六十项循环一次。所以问题就解决了。。。
5:
友好数字 10’
描述
Laofu有10个友好数字,现在Laofu想知道他这10个数字分别对42取余的结果中,所有结果数位上总共出现了多少个不同的数字。
输入
输入10行,每行一个非负整数,每一个数均不超过1000。
输出
输出一个整数表示数位上出现的不同数字的个数。
样例
输入复制
1
2
3
4
5
6
7
8
9
10
输出复制
10
输入复制
39
40
41
42
43
44
82
83
84
85
输出复制
6
输入复制
42
84
252
420
840
126
42
84
420
126
输出复制
1
思路:还是水题。。。
代码:
#include <stdio.h>
int a[11],t,x,p,ans;
int main()
{
for(int i=0;i<10;i++)
{
scanf("%d",&x);
t=x%42;
if(t==0&&!a[t])
{
a[0]=1;
ans++;
}
while(t)
{
p=t%10;
t/=10;
if(!a[p])
{
a[p]=1;
ans++;
}
}
}
printf("%d",ans);
return 0;
}
6:
友好序列 15’
描述
Laofu同学,闲来无事,养了N只鸽子,并且每天坚持训练他们。终于建这些鸽子培养成了一批不仅听指挥还长的一模一样的鸽子。鸽子编号1,2,…N
每天早晨,Laofu同学希望所有的鸽子都能够整齐友好的排成一列。
Laofu把这种排列称之为友好序列,其定义规则如下:
序列左半部分鸽子朝一个方向看,而右半部分鸽子朝另一个方向看
偶数编号的鸽子均朝同一个方向,奇数编号的鸽子均朝另一个方向看
两个规则满足其一,便称之为友好序列
由于有些鸽子早晨起来没有睡醒,需要Laofu同学调整其朝向,使得这N只鸽子排成一个友好序列。
现在Laofu想知道,他最少需要调整几只鸽子,使得该鸽子序列满足友好序列。
输入
第一行输入一个整数N,表示鸽子的数量
第二行输入N个字符,表示每一只鸽子的朝向。L表示超向左边,R表示朝向右边
输出
输出一个数字表示答案
样例
输入复制
8
RLLRRRLL
输出复制
4
输入复制
4
RRLR
输出复制
1
提示
样例1解释
将编号1,4,7,8的鸽子调整转向
样例2解释
将编号为1的鸽子调整转向,当然,还存在其他调整方案。
数据规模
2≤N≤100000,且N为偶数
思路:仔细分析,又是一个水题。。。按照题目所述的规则,总共就四种情况。**
左边L,右边R
左边R,右边L
奇数L,偶数R
奇数R,偶数L
计算每种情况需要调整的最少次数即可。
代码:
#include <stdio.h>
int n,ans,t1,t2,t3,t4;
char a[100005];
int min(int x,int y,int j,int k)
{
if(x>y) x=y;
if(x>j) x=j;
if(x>k) x=k;
return x;
}
int main()
{
scanf("%d",&n);
scanf("%s",a);
for(int i=0;i<n;i++)
{
if(i<n/2)
{
if(a[i]!='R')
{
t1++;
}
if(a[i]!='L')
{
t2++;
}
}
else
{
if(a[i]!='L')
{
t1++;
}
if(a[i]!='R')
{
t2++;
}
}
if(i%2)
{
if(a[i]!='R')
{
t3++;
}
if(a[i]!='L')
{
t4++;
}
}
else
{
if(a[i]!='L')
{
t3++;
}
if(a[i]!='R')
{
t4++;
}
}
}
ans=min(t1,t2,t3,t4);
printf("%d",ans);
return 0;
}
7:
友好组合 20’
描述
Laofu同学在研究排列排列时发现一种有趣的组合,命名成友好组合。
当两个数的二进制表示中至少有K个位置上的值不同,则称这两个数是相对安全。
例如:
数字60转成二进制为:0 1 1 1 1 0 0
数字85转成二进制为:1 0 1 0 1 0 1
加粗位置上对应的值不同,60与85共有4个位置上的不同
他对友好组合的定义为:在N个数中(0,1,2,…N−1)选出MM个数,这MM个数中任意两个都是相对安全的。
你能够帮Laofu找出一种友好组合吗?当然,如果有多组满足条件的解,请输出字典序最小的解。
输入
输入一行包含三个整数:N,M,K,其表示的意思如题目描述
输出
输出字典序最小的友好组合,共M个十进制数。从小到大排序,相邻两个数字中间用空格隔开,每10个一行。
数据保证至少能找到一种满足条件的友好组合
样例
输入复制
8 2 2
输出复制
0 3
输入复制
256 5 4
输出复制
0 15 51 60 85
提示
数据规模
1≤N≤256,1≤M≤64,1≤K≤7,数据保证N均为2的幂次
思路:本题数据规模很小,直接贪心枚举即可。又是一道水题。。。
代码:
#include <stdio.h>
#include <string.h>
int n,m,k,t,p,f;
int a[260][10],b[65],book[333];
void er(int x)
{
int q;
for(int i=0;i<=x;i++)
{
t=0;
q=i;
while(q)
{
a[i][t++]=q%2;
q/=2;
}
}
}
int ok(int x,int y)
{
int temp=0;
for(int i=0;i<=8;i++)
{
if(a[x][i]!=a[y][i])
{
temp++;
}
if(temp>=k)
return 1;
}
return 0;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
er(n);
for(int i=0;i<n;i++)
{
b[0]=i;
book[i]=1;
p=1;
for(int j=i+1;j<n;j++)
{
f=0;
for(int ee=0;ee<p;ee++)
{
if(!ok(b[ee],j))
{
f=1;
break;
}
}
if(!f)
{
b[p++]=j;
book[j]=1;
}
if(p==m)
{
break;
}
}
if(p==m)
{
break;
}
else
{
memset(b,0,sizeof(int )*65);
memset(book,0,sizeof(int )*300);
}
}
int qq=0;
for(int i=0;i<n;i++)
{
if(book[i])
{
printf("%d ",i);
qq++;
if(qq%10==0)
printf("\n");
}
}
return 0;
}