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("
");
			
		}
	}
	return 0;
}
原文地址:https://www.cnblogs.com/fxzemmm/p/14847981.html