「题解报告」P7301 【[USACO21JAN] Spaced Out S】
神奇的5分算法:直接输出样例。
20分算法
直接把每个点是否有牛的状态DFS一遍同时判断是否合法,时间复杂度约为\(O(2^{n^2})\)(因为有判断合法的剪枝所以会比这个低)。而在前四个测试点中\(N\le4\),用枚举算法在最坏情况下需要运行\(65536\)次,时间非常富裕,但是在之后的测试点中就会超时了。
50分算法
每四个方格内都有\(C^2_4=6\)种方法放置牛:
1 2 3 4 5 6
CC C. C. .C .C ..
.. C. .C C. .C CC
DFS每四个方格内的六种情况同时判断是否合法,时间复杂度约为\(O(6^{n^2})\)(因为有判断合法的剪枝所以会比这个低)。
部分参考代码:
int a[1001][1001],ans,n;
char v[1001][1001];
string d[]={"cc00","c0c0","c00c","0cc0","0c0c","00cc"};
int dx[]={0,0,1,1};
int dy[]={0,1,0,1};
void dfs(int x,int y){
int nextx=x,nexty=y+1;
if(nexty==n) nextx++,nexty = 1;
if(x>=n){
int newscore=0;
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) newscore+=v[i][j]=='c'?a[i][j]:0;
ans=max(ans,newscore);//更新答案
return;
}
for(int i=0;i<6;i++){
int match=true;
string old="";
for(int j=0;j<4;j++) old+=v[x+dx[j]][y+dy[j]];
for(int j=0;j<4;j++){
int row=x+dx[j],col=y+dy[j];
if(v[row][col]!=' '&&v[row][col]!=d[i][j]){//判断是否合法
match=false;
break;
}
}
if(match){
for(int j=0;j<4;j++) v[x+dx[j]][y+dy[j]]=d[i][j];
dfs(nextx,nexty);
for(int j=0;j<4;j++) v[x+dx[j]][y+dy[j]]=old[j];
}//回溯
}
}
上面这份代码是我的神仙老师 @akic 写的,大家可以去膜拜他
满分算法
先给大家看几种合法的\(3\ast3\)放置方法:
C.C CC. C.C ..C
C.C ..C .C. CC.
.C. CC. C.C ..C
发现了吧,每一行或每一列的奶牛排列方式一定是交替排列的,而且上一行或上一列的交替排列方式对这一行或这一列交替排列方式没有影响,所以我们只需要先计算每一行的奇数列之和 和 偶数列之和 以及每一列的奇数行之和 和 偶数行之和(建议多读几遍,我当时都写晕了),再取每行的两种交替方式中的最大值,最后再取行上交替排列和列上交替排列的最大值就是答案了。
参考代码:
#include <bits/stdc++.h>
using namespace std;
int n,a,x[1010][2],y[1010][2],num,ans;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
scanf("%d",&a),x[i][j%2]+=a,y[j][i%2]+=a;
for(int i=1;i<=n;++i)
num+=max(x[i][1],x[i][0]),ans+=max(y[i][1],y[i][0]);
printf("%d",max(num,ans));
return 0;
}//为什么大家的代码都这么长啊……
Update 1(2021/2/14):改正了50分算法的时间复杂度
「题解报告」P7301 【[USACO21JAN] Spaced Out S】的更多相关文章
- 「题解报告」 P3167 [CQOI2014]通配符匹配
「题解报告」 P3167 [CQOI2014]通配符匹配 思路 *和?显然无法直接匹配,但是可以发现「通配符个数不超过 \(10\) 」,那么我们可以考虑分段匹配. 我们首先把原字符串分成多个以一个通 ...
- 「题解报告」P4577 [FJOI2018]领导集团问题
题解 P4577 [FJOI2018]领导集团问题 题解区好像没有线段树上又套了二分的做法,于是就有了这片题解. 题目传送门 怀着必 WA 的决心交了两发,一不小心就过了. 题意 求一个树上最长不下降 ...
- 「题解报告」P2154 虔诚的墓主人
P2154 虔诚的墓主人 题解 原题传送门 题意 在 \(n\times m\) 一个方格上给你 \(w\) 个点,求方格里每个点正上下左右各选 \(k\) 个点的方案数. \(1 \le N, M ...
- 「题解报告」SP16185 Mining your own business
题解 SP16185 Mining your own business 原题传送门 题意 给你一个无向图,求至少安装多少个太平井,才能使不管那个点封闭,其他点都可以与有太平井的点联通. 题解 其他题解 ...
- 「题解报告」Blocks
P3503 Blocks 题解 原题传送门 思路 首先我们可以发现,若 \(a_l\) ~ \(a_r\) 的平均值大于等于 \(k\) ,则这个区间一定可以转化为都大于等于 \(k\) 的.我们就把 ...
- 「题解报告」P3354
P3354 题解 题目传送门 一道很恶心的树形dp 但是我喜欢 题目大意: 一片海旁边有一条树状的河,入海口有一个大伐木场,每条河的分叉处都有村庄.建了伐木场的村庄可以直接处理木料,否则要往下游的伐木 ...
- 「题解报告」CF1067A Array Without Local Maximums
大佬们的题解都太深奥了,直接把转移方程放出来让其他大佬们感性理解,蒟蒻们很难理解,所以我就写了一篇让像我一样的蒟蒻能看懂的题解 原题传送门 动态规划三部曲:确定状态,转移方程,初始状态和答案. --神 ...
- 「GXOI / GZOI2019」简要题解
「GXOI / GZOI2019」简要题解 LOJ#3083. 「GXOI / GZOI2019」与或和 https://loj.ac/problem/3083 题意:求一个矩阵的所有子矩阵的与和 和 ...
- 【题解】#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT)
[题解]#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT) 之前做这道题不理解,有一点走火入魔了,甚至想要一本近世代数来看,然后通过人类智慧思考后发现, ...
随机推荐
- 不是吧?30秒 就能学会一个python小技巧?!
大家好鸭!我是小熊猫 很多学习Python的朋友在项目实战中会遇到不少功能实现上的问题,有些问题并不是很难的问题,或者已经有了很好的方法来解决.当然,孰能生巧,当我们代码熟练了,自然就能总结一些好用的 ...
- Optional 类
@Test public void test2(){ Girl girl = new Girl(); // girl = null; //ofNullable(T t):t可以为null Option ...
- Session会话 Cookie JSTL标签
Cookie 1) HTTP是无状态协议(连接结束后就自动断开),服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出.这样的设计严重阻碍的Web程序的设计.如:在我 ...
- 【C++】学生管理系统
[C++]学生管理系统 一道非常经典的C语言题目,用C++实现 题目如下: 输入功能:由键盘输入10个学生的学号.姓名.三科成绩,并计算出平均成绩和总成绩,然后将它存入文件stud.dat. 插入 ...
- 面试突击64:了解 HTTP 协议吗?
HTTP(Hyper Text Transfer Protocol)超文本传输协议,下文简称 HTTP,它的作用是用于实现服务器端和客户端的数据传输的.它可以传输任意的数据类型,如文本.HTML.图片 ...
- LDAP+Gitea统一认证Git服务器账户管理openLdap和微软的ad
很多时候我们需要管理多个内容管理系统,比如Jira.Jenkins.GitEA/Gitlab等等各种管理系统,我们需要每一套管理系统每个人都管理一套密码,每套系统每套密码简直是一种灾难,于是LDAP可 ...
- day01 Java_JVM,JCR,JDK
精华笔记: java开发环境: 编译运行过程: 编译期:.java源文件,经过编译,生成.class字节码文件 运行期:JVM加载.class并运行.class(0和1) 特点:跨平台.一次编程到处使 ...
- stringstrean类中关于clear和str的比较
stringstream类涉及到多次类型转换的时候容易出现异常错误 因为第一次数据如果读入eof或者输出完整来到eof,此时stringstream会自动为其添上eofbit标志位,此时继续进行任何操 ...
- 循环数组%操作下的一些解释(对于4.4UVA133的一些解释)
1.循环数组一般不推荐通过建立相同的数组不断叠加来实现,虽然理论上是可行的,但是会浪费极大的空间,特别是对于大数据的情况下,程序一般会马上挂掉 2.循环数组的结构表示中的一种常用形式就是通过取余操作来 ...
- C# 基础知识-反射
一.反射 1>反射的命名空间是System.Reflection 2>是.Net框架提供的帮助类库,读取并使用matedata 二.反射基本用法 举例如下 1>Assembly as ...