第一次实验室排位赛
反思:为什么我只一次倒了这样的底部,甚至一道题到没有正确,这是非常令人难受,一方面,我的心态不平稳,频繁的报错与超十万让我心态太崩,至于出现不好的变现,另一方面,我还在吃啊老本,用以前的知识打现在的代码,以至于自身能力在这一次中表现的尤为欠缺,以次两点,必须要迅速改变,让自己不断变适应新形势代码,新的解题思路,新的套路与方法,而不是坐在那里,事倍功半,以此警戒,以此名心。
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 - 可鞥吧–贪心
你有 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 - 最后是啥呢
「融合」是《游戏王》集换式卡牌游戏中的一张通常魔法卡,是最早对融合怪兽进行融合召唤的魔法卡,也是进行融合召唤的泛用魔法卡。
现在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、其实每次去哪两个都可以,但是官方题解是每次取最大的两个,可能他想贪心一下
正解,其中也有贪心的想法,应在思考一下