昨天本来想去写《均分数据》的,但题解有个细节一直没看懂,就没去写了。写了《三步必杀》,然后去看了《HH的项链》,本来是想复习莫队的,结果数据已经被改数据狂魔\(\text{chen_zhe}\)改的莫队过不去了,但我看懂了主席树题解不亏,但没实现,打算今天实现。
昨晚的考试。再次爆炸
\(T1\) 加工生产调度
。。多少年前的毒瘤题了。。
我排序方法错了,然后就\(100\)->\(0\)了。
先对所有产品按\(min(a,b)\)升序排序,然后再从左到右扫一遍,如果\(a>b\)就放右边,否则放左边。
因为\(min(a,b)\)越小就代表这个产品能节省越多的时间,如果\(a\)小就放左边,\(b\)小就放右边。
\(T2\) 集合划分
题目不难,就是出数据的人爆\(int\)了,所以我们要跟着他爆\(int\)才能过
我用的记搜,时间复杂度\(O(2^n)\)
其实这题就和\(n\)个球放进\(n\)个盒子允许空盒是一样的,
递推方程:\(f[i][j]=f[i-1][j-1]+f[i][j-1]\),答案就是\(f[n][n]\),时间复杂度\(O(n^2)\)
\(T3\) 地毯填补
看起来有点复杂,加上旁边很多人都说没有\(spj\)过不了,我干脆了没写了qwq,考完一看,这不是很久之前写过的很水的分治吗我怎么一点印象也没有。亏了。
把正方形一分为四递归处理,公主在的子正方形会填满,其他三个各剩一个,集中在中心,然后再放一个就行了。
void fill(int size, int x, int y, int px, int py){
if(size == 1) return;
int X = x + size - 1, Y = y + size - 1;
int midx = (x + X) >> 1, midy = (y + Y) >> 1;
size >>= 1;
if(px <= midx && py <= midy){
printf("%d %d %d\n", midx + 1, midy + 1, 1);
fill(size, x, y, px, py);
fill(size, x, midy + 1, midx, midy + 1);
fill(size, midx + 1, y, midx + 1, midy);
fill(size, midx + 1, midy + 1, midx + 1, midy + 1);
}
if(px <= midx && py > midy){
printf("%d %d %d\n", midx + 1, midy, 2);
fill(size, x, y, midx, midy);
fill(size, x, midy + 1, px, py);
fill(size, midx + 1, y, midx + 1, midy);
fill(size, midx + 1, midy + 1, midx + 1, midy + 1);
}
if(px > midx && py <= midy){
printf("%d %d %d\n", midx, midy + 1, 3);
fill(size, x, y, midx, midy);
fill(size, x, midy + 1, midx, midy + 1);
fill(size, midx + 1, y, px, py);
fill(size, midx + 1, midy + 1, midx + 1, midy + 1);
}
if(px > midx && py > midy){
printf("%d %d %d\n", midx, midy, 4);
fill(size, x, y, midx, midy);
fill(size, x, midy + 1, midx, midy + 1);
fill(size, midx + 1, y, midx + 1, midy);
fill(size, midx + 1, midy + 1, px, py);
}
}
\(T4\) 金币排列问题
这不是很久前的那道毒瘤题《魔板》吗
算了,果断放弃
\(T5\) 雇佣计划
\(hkw\):这不是最小费用最大流吗
%%%
不会啊
我就写了个搜索骗了60分,海星。
炸了炸了炸了。
9.29:改题,写《HH的项链》,然后复习吧