zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    2019-2020-20191201《信息安全专业导论》第4周学习总结
    2019-2020-20191201《信息安全专业导论》第3周学习总结
    2019-2020-191201《信息安全专业导论》第二周学习总结
    计算机概论速读提问
    自我介绍
    20191302第六章学习笔记
    20191302反汇编测试
    20191302mystat
    20191302 第五章学习
    20191302 第四章学习笔记
  • 原文地址:https://www.cnblogs.com/fxzemmm/p/14847981.html
Copyright © 2011-2022 走看看