T1 swap swap
有几个一直超过时间限制 我本想用归并排序但是一直没能成功。
或许可以试试先让它每得出一个小于w的就加起来,最后从最后一个位置开始递减,只要满足就好。i代表前i个被确定了,如果跳出了,到i也都是确定的。
sum其实就是i+1个的和,所以要一直减到小于等于b,因为i是从0开始的,所以个数要最后为i+1
还是失败了,这个还是超过了时间限制,合理怀疑还是选择排序实在是太大了..
还是得换排序方法。这次选择快速排序。
快速排序 | 菜鸟教程 (runoob.com)这个讲的很好,挖坑填数挺形象的。
因为要找小于一个数的最大值,所以以之为基准只用排左边的。但是以它为基准不一定有坑位用来放它。没有坑位就创造一个,放到最后。经过一次之后左边的都小于这个基准。但是等于的情况会怎么样???等于的可能分布在左右两边...不行!等于的也要放左边
分了两个函数实现:第一个用来实现确定基准的位置(数据中本有和它相等的只放在左边)(也就是第一次快速排序);第二个函数将基准左边的进行排序(运用递归)(排好之后也确定了能买到的最贵的价格。
最后用一个循环将左边一个个加上去,没有超时。
woc..全a了woc...
T5. 诸葛兔猜数
第一反应是每次取中值 y大了取左边,y小了取右边
输出最终答案,其他都是系统输出的询问情况
1.要怎么描述二分法??——可以一直循环,输出之后就结束
2.很难解决x>=y的时候都是1——可以加一个判断就是y+1的时候是否x要小。
21个无效内存引用给我整笑了。
???为什么会出现exit(1)结束不了循环。while(0)也结束不了循环..它在进行循环
因为会出现不是13就是6的情况就会一直循环。因为6=13/2 13=(6+20)/2
搞错了原来,是要找中值!要留一个记录上一个的mid,up,down中值上下界。每次更新上下界,最终完成。
不是说下面的输出不用管的吗?确实略微drama
woc果然一切都是我的问题(我的代码有问题)应该一个个去分析有什么会造成不输出,一直没有想过是exit会导致后面全部退出。wrong output format Unexpected end of file — int32 expected这个就是代表被意外终止了?
要考虑上界为要输出的数的情况。
还是觉得要用小数比较放心。要怎么处理取左还是取右?
或许是左括号内每次都会调用guess?所以要提出来。——还是有7个A不了
删去了一次guess的调用——哈哈哈哈哈哈哈终于a了woc 竟然最终的问题是我的guess用太多次了。
T6萝卜三元组
真的很想就让它一个个遍历
找最小的有什么意义呢?? 应该求差最小啊比较他们干什么...为什么要调用xls??但是如果调用xls找到最小值之后可以知道这是这一堆里面的最小值,i,j,k之后的全部。
代表其他两列后面的数和它的差会越来越大,但是另外两个互相的差可能会变小,但是总的影响还是>=0所以D会变大。但是可以改变自身去缩小D?如果增加自身反而增大了D,可以改变另外一个。如果增加自身但是D变小了就继续增加,直到末尾或者D变大。
目前结论:1.找到最小值所在数组a,另外两个往后移只会造成D增大,所以只能后移a,每一轮都要判断。
2.后移一位,如果仍旧是最小的,继续后移,代表D减小;若不是最小的,D可能增大可能减小。如果D增大会怎么样?还是要考虑后续的情况
总之:1.一直找最小的,然后一直往后移直到它不再是三个中最小的,然后换另一个最小的开始轮下去,每换一个数组之前把D求出,如果小于以前的就记录下来
2.一轮中有一个遍历到末尾了,就结束了;如果D 有0的情况,直接结束。
过程:每次都只轮最小值所在的数组+最小值到了最后一位就结束。
问题:一直往后移直到它不再是三个中最小的——这个要怎么实现?!——不是第一次且这一次改变的与上一次的不一样
要怎么样减少D和xls的调用...能求出来了,但是没办法知道咋最少。我本以为每次换数组的时候才算D已经少了,但是我真觉得xls还是每次都需要用到,包括最后一次。
A:原来要用贪心啊..
woc原来我琢磨出了贪心,我对于b的考虑确实没有太正确,但是歪打正着。我确实是只移动最小的数组的下标,也是只遍历完一个就终止啊...
为什么会这样,我明明在本地编译器上挺好的...
是不是我想的太复杂了..它是不是不用每次都判断是不是最后一次,按理说这是一种优化..
那就直接记下每次的D了 。
我懂了,是没有return出结果...
我之前的没有问题!!!!!就是没有去return出结果。
T7白兔让萝卜
目的:尽可能少地比较得出最大最小值
或许可以用冒泡排序 很显然会用4n次所以不行。快速排序呢??快速排序+冒泡排序结合?第一次选出基准,第二次选出首尾也要4n次..可以这样woc:(19条消息) 如何用最少的比较次数找出一个数列的最大和最小值_iteye_16311的博客-CSDN博客
想把它变成c的形式:出现:C语言编译报错error: variably modified ‘***’ at file scope
因为用了const int maxn = 200005;在C语言中,const不是一个真真正正的常量,其代表的含义仅仅是只读。使用const声明的对象是一个运行时对象,无法使用其作为某个量的初值、数组的长度、case的值或在类型的情形中使用。
解决方法
使用宏定义#define代替只读类型const
由const修饰的类型在内存中占空间而#define不占空间,#define只是在编译前将要编译的源文件中相应的部分使用字符串替换例如前面的代码在编译前会被预处理
wocccccccccccc这道题全a了!!!!谁懂谁懂!!
T8找大佬
上道题是2n个人 只有大和小两种情况 这次是n个人,要保证大于所有人的同时还要确保所有人小于他
就一道题了!!!
总之:1.找第i列,全为0(在别人不比他强的情况下,他一定比别人强。那为什么要提“我比你强,你也比我强”的可能性?)
2.对角线全为0
目的:找到第i列全为0;第i行除了对角线全为1的i
猜想:如果前面一直是0到了后面(假设第j个)为1,到1说明j之前i都比他们强,所以下一次直接从第j列开始;比较j和i哪个大,j大就轮第j列,i大就轮i+1。
目前想法:
第一次:有7个wa,10个ac。——对角线上的不用遍历 删去考虑对角线的情况吧(没有改良)
第二次:那为什么要提“我比你强,你也比我强——考虑一下满足了条件之后的行是否除了对角线就都是1
好像是忘记break了一个。。。
第三次:把第i行都遍历了一遍,确保除了对角线全是1 但是为什么越改越挫??
为什么我这么改对的更少了... 改了没差,可能是边界问题。
这个解法放弃了,总感觉会超过限制。
法二:
1.int better(int a, int b) 找可能的大佬
1 | a比b强 b不是大佬 |
0 | a不比b强 a不是大佬 |
2.找到一个可能的大佬之后再对它进行行和列的遍历。
有一个a不了,合理怀疑是-1的情况没考虑,,但是不可能出现-1的情况的把...还真是...
总之要先找可能的大佬再去遍历!!better可以告诉哪个是哪个不是,又由假设现在有名同学(编号为到)在班级里,这里面可能存在最多一名大佬,就可以排除掉其他,留住最后一个。其实还是有点不得要领。所以ac了也不是很开心...