大概这一场考的还算可以吧..
上来刚A...然后A死难写...
然后B是水题..
C猜了个结论错掉了,也找到了反例
然后后面干脆的直接把数据random_shuffle以后再跑这个贪心...
就过了...
D..
感谢Q巨...
Q巨猜了个结论让我交了一发..
然后过了...
========================================================
A题
给你一个4*n的网格图,第一行第四行是停车场
第二行第三行是过道
现在一共有k辆车(编号1~k)停在过道上,你需要把它们挪到正确的位置上
你一旦将一辆车停入停车区,就不可以移动它,也就是说你必须让正确的车进入正确的位置
求一个20000步以内的方案,n<=50,k<=2n
做法;
你可以考虑,整个2*n的区域直接把它变成一个环,
例如上图
把它变成
1->2->0->4
^ |
| v
5<-0<-0<-3
的一个环,然后在这个环上每次移动一个车,顺便把前面所有的车都往前推一格(或者推进目的地)
时间复杂度O(100*99+100) 99表示最多移动99下才能到目的地(这个环上)
我们就一直让它转直到所有车都到目的地
(如果位置是满的,而且一开始没有车可以到目的地,输出-1)
实现的时候不是这么写的..而是把每个没到终点的都往终点推...
B题
2n个数,1~n各出现2次
每次可以交换两个连续的数
问几次能让每个数出现的两次是连续的
n<=100
直接...暴力把跟第一个相同的拖到第二个....然后依次做下去...
C题
n个向量,长度<=1e6
每个向量可以选择+1或者-1倍,要求
最后向量的和加起来长度<=1.5*1e6
我的做法:
直接每次让当前向量和下一个合并,取小的那一个
如果最后发现错了,就把数据random_shuffle一下,再做一次,直到做出来为止
过了,虽然不知道为啥
std做法:
每次三个里面,肯定有两个(可能经过乘以-1后)会有一对成为一个120°以外的角
那么两个<=1e6的向量加起来还在1e6以内
那么最后就可以得到两个,加起来一定在1.5*1e6(实际上在sqrt(2)*1e6)以内
D题:
A和B在玩一个游戏
它们在填一个n位的二进制数,每次随机一个人过来选一位填成0或者1
最后得分是c[二进制数数值]
A要让它尽量大,B要让它尽量小
问期望得到的值是多少,然后接下来r次修改
每次修改c数组里面一个数的值,然后再询问
n<=18
r<=218
做法:
直接所有的c的和然后除以2^n
Q老师的结论...
EF不会做
A
#include #include
B
#include #include
C
#include #include
D
#include #include