第一次实验室排位赛

本文反思了一次实验中的挫折,强调了适应新技术、解题策略和心态调整的重要性。通过实例探讨了如何判断Sky数,涉及二进制转换,并提到了哥德巴赫猜想、异或运算及亲和数概念。后续部分分享了C题中的博弈论思维和编程挑战,以及提升算法效率的方法。
摘要由CSDN通过智能技术生成

第一次实验室排位赛

反思:为什么我只一次倒了这样的底部,甚至一道题到没有正确,这是非常令人难受,一方面,我的心态不平稳,频繁的报错与超十万让我心态太崩,至于出现不好的变现,另一方面,我还在吃啊老本,用以前的知识打现在的代码,以至于自身能力在这一次中表现的尤为欠缺,以次两点,必须要迅速改变,让自己不断变适应新形势代码,新的解题思路,新的套路与方法,而不是坐在那里,事倍功半,以此警戒,以此名心。

A - Sky数

熊熊学长从小喜欢奇特的东西,而且天生对数字特别敏感,一次偶然的机会,他发现了一个有趣的四位数2992,这个数,它的十进制数表示,其四位数字之和为2+9+9+2=22,它的十六进制数BB0,其四位数字之和也为22,同时它的十二进制数表示1894,其四位数字之和也为22,啊哈,真是巧啊。熊熊学长非常喜欢这种四位数,由于他的发现,所以这里我们命名其为Sky数。但是要判断这样的数还是有点麻烦啊,那么现在请你帮忙来判断任何一个十进制的四位数,是不是Sky数吧。

重点 关于二进制转化

不是很了解相关知识点,学习相关知识
在这里插入图片描述

在这里插入图片描述

B题——哥德巴赫来了可能有用吧 -学习新的思路

倩倩学姐想把一个偶数拆成两个不同素数的和,你有有几种拆法呢?

#include<stdio.h>
int main()
{
	int a[501],c[1000],d,f,i,m,le=1,a1[501],le1[501]={0},t,g=0;
	for(t=1;t<=501;t++)
	{
		le=1;
		scanf("%d",&a[t]);
		if(a[t]==0)
			break;
		g++;
		for(i=2;i<=a[t];i++)
		{
			d=0;
			for(m=2;m<=i-1;m++)
			{
				if(i%m==0)
					d++;
			}
			if(d==0)
			{
				c[le]=i;
				le++;
			}
		}
		for(i=1;i<=le;i++)
		{
			for(m=i+1;m<=le;m++)
			{
				if(a[t]==c[i]+c[m])
					le1[t]++;
			}
		}
	}
	for(t=1;t<=g;t++)
	{
		printf("%d\n",le1[t]); 
	}
	return 0;
}

超时
在这里插入图片描述在这里插入图片描述在这里插入图片描述

学习有关新的思路

C题——咦!这是嘛呀 --学习异或新思想

在这里插入图片描述

在这里插入图片描述

总结 其他相关

C题——咦!这是嘛呀!

找规律

#include<stdio.h>
int main(void)
{
	int a,b,c,i,m,n,sum[1000][1000],t,d[1000];
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a);
		for(m=a-1;m>0;m--)
		{
			sum[i][m]=1;
			for(t=m-1;t>0;t--)
			{
				sum[i][t]=sum[i][t]*t;
			}
			sum[i][m]=sum[i][m]*m;
			sum[i][m]=sum[i][m-1]+sum[i][m];
		}
		d[i]=sum[i][m]-a;
	}
	for(i=1;i<=n;i++)
	{
		if(d[i]<=0)
			printf("1\n");
		else
			printf("%d\n",d[i]);
	}
	return 0;
}

E题——看看就好,劝一下自己

古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:

1+2+4+5+10+11+20+22+44+55+110=284。

而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。

你的任务就编写一个程序,判断给定的两个数是否是亲和数

#include<stdio.h>
int main()
{
	int n,i,m,c[10000],sum;
	int a,b;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		sum=0;
		scanf("%d  %d",&a,&b);
		for(m=1;m<=a-1;m++)
		{
			if(a%m==0)
				sum=sum+m; 
	 }
		if(sum==b)
			c[i]++;
	}
	for(i=1;i<=n;i++)
	{
		if(c[i]==1)
			printf("YES");
		else
			printf("NO");
		if(i<n)
			printf("\n");
	}
	return 0;
 } 

观察看自己错在哪里

●法一:暴力求解

●法二:约数和打表

●这个就是提高了算法效率,就是他不是就是600000以内吗

●我把他们的每个数的约数和求出来存在数组就好了

●这个也可以暴力求解

●也可以利用好数论相关知识

在这里插入图片描述
在这里插入图片描述

F - 熊熊的尝试–学习博弈论

●最简单的博弈论——巴什博弈(只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。)

●思考:最多取m个,如果剩下m+1个是不是无论第一个人如何取,后手都能一次取完

●也就是说:无论他们前边如何拿如果n=(m+1)r+s(换句话说就是当先手拿走s个时,后手总能保证剩下的为m+1的整数倍,则后手必胜,否则先手必胜)

●例如:先手拿走s个,后手拿走k个保证剩下的是(m+1)的整数倍,则后手必胜,如果先手拿走s个使得剩下的为(m+1)的整数倍,则先手必胜

●结论:n % (m+1) == 0,后手必胜;否则先手必胜

G - 该烂怂塔,有啥看的–找从上到下,从下到上在这里插入图片描述

输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。

I - 可鞥吧–贪心

CodeForces - 1430B

你有 n个 桶放在一排 , 从左到右开始编号分别为1~n. 最初, 第 i 桶装的水是 ai 升.

你可以把水从一个桶倒到另一个桶。 在这个过程中, 你可以两个选择两个桶 x 和y (第 x个桶不应该为空) 然后从桶x 向桶 y 倒水(可能是所有的水).你可以假设桶的容量是无限的,所以你可以在每个桶里倒入任何数量的水。

如果最多可以倒水 k 次.计算桶中最大和最小水量之间的最大可能差。

举例

  • 如果你有四个桶,每个桶里装5升水,k=1,你可以从第二个桶里倒5升水到第四个桶里,所以桶里的水量是[5,0,5,10],最大和最小的差值是10;
  • 如果所有的桶都是空的,你就不能做任何操作,所以最大和最小的量之差仍然是0。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-624i7qGO-1606734432181)(C:\Users\leaf joe\AppData\Roaming\Typora\typora-user-images\image-20201130184744697.png)]

J - 最后是啥呢

CodeForces - 1430C

「融合」是《游戏王》集换式卡牌游戏中的一张通常魔法卡,是最早对融合怪兽进行融合召唤的魔法卡,也是进行融合召唤的泛用魔法卡。

​ 现在zwt也想练习一下融合,他的目标转向了数组

​ 每次zwt可以选择两个不同的数字,并且大喊一声“フュージョン!!!”,然后这两个数字就会融合,变成他们和的一半(向上取整)放到数组里

​ 现在有一个序列1,2,3,4,………,n,zwt想知道他要施法几次,每一步选择哪几个数字,这个数组才能变成一个数,并且使得这个最后留下的数字最小

​ 如n=4,

​ 1.选择a=2,b=3,数组变为[1,3,3]

​ 2.选择a=3,b=3,数组变为[1,3]

​ 3.选择a=1,b=3,数组变为[2]

​ 如果有多种方案,输出任意一种

●题意:就是给你1到n的数列,让后你每次操作取出a、b放入 ,然后n-1次后就会剩下一个数

●让你想办法,如何操才能使最后的数最小,最小是多少,每次操作取那两个数

●题解:

●1、明确你不论如何操作最小值都会是2

●2、其实每次去哪两个都可以,但是官方题解是每次取最大的两个,可能他想贪心一下

在这里插入图片描述

.选择a=1,b=3,数组变为[2]

​ 如果有多种方案,输出任意一种

●题意:就是给你1到n的数列,让后你每次操作取出a、b放入 ,然后n-1次后就会剩下一个数

●让你想办法,如何操才能使最后的数最小,最小是多少,每次操作取那两个数

●题解:

●1、明确你不论如何操作最小值都会是2

●2、其实每次去哪两个都可以,但是官方题解是每次取最大的两个,可能他想贪心一下

在这里插入图片描述

正解,其中也有贪心的想法,应在思考一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值