「题解报告」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) 之前做这道题不理解,有一点走火入魔了,甚至想要一本近世代数来看,然后通过人类智慧思考后发现, ...
随机推荐
- HMS Core 视频编辑服务开放模板能力,助力用户一键Get同款酷炫视频
前言 短视频模板,是快捷创作短视频的一种方式,一般由专业设计师或模板创作人制作,用户只需替换视频模板中的部分素材,便可生成一支与模板一样的创意视频.这种省时省力.无需"烧脑"构思创 ...
- 学了WEB缓冲投毒-挖SRC的时候咋利用
学了WEB缓冲投毒-挖SRC的时候咋利用 昨天发了哥WEB缓存投毒的学习文章,但是除了理论和训练营并无实践,正巧翻到了一篇文章,感觉还有点关系,转的一个国外的老哥的文章. 微信公众号:小惜渗透,欢迎大 ...
- Javaweb-Servlet学习
1.Servlet简介 Servlet就是sun公司开发动态web的一门技术 Sun在这些API中提供一个借口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤: 编写一个 ...
- Java实用类(五) -Math类和指定范围的随机数
1.Math类 java.lang.Math类提供了常用的数学运算方法和两个静态常量E(自然对数的底数) 和PI(圆周率) // 绝对值 System.out.println(Math.abs(-3. ...
- 【翻译】 For OData For C# play on RESTier
要获得统一的体验,请转到GitHub Issues询问问题,报告错误并要求功能.本文档适用于当前版本 1.0(第一个 GA).0.6.0版本文档参考0.6.0版本文档. 入门 1.1引言 OData ...
- UiPath视频教程
UiPath机器人企业框架简介https://www.bilibili.com/video/BV1SK411L7u9 UiPath借助第三方Pdf软件工作https://www.bilibili.co ...
- NC14661 简单的数据结构
NC14661 简单的数据结构 题目 题目描述 栗酱有一天在网上冲浪的时候发现了一道很有意思的数据结构题. 该数据结构形如长条形. 一开始该容器为空,有以下七种操作. 1 a从前面插入元素a 2 从前 ...
- C#实现一个万物皆可排序的队列
需求 产品中需要向不同的客户推送数据,原来的实现是每条数据产生后就立即向客户推送数据,走的的是HTTP协议.因为每条数据都比较小,而数据生成的频次也比较高,这就会频繁的建立HTTP连接,而且每次HTT ...
- E: Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/t
sudo apt-get remove libappstream3
- 000Java_Java_历史
1. Java历史 程序:有序指令的集合 1995年--Java.1版本 Java之父--Gosling Java特点 面向对象 健壮 (强类型机制异常处理垃圾的自动回收) 跨平台性[一个编译好的.c ...