2022杭电多校赛第八场

文章目录

  • 2022杭电多校赛第八场
    • 1004.Quel'Thalas
    • 1001.Theramore
    • 1011.Stormwind
    • 1008.Orgrimmar
    • 1005.Ironforge

1004.Quel’Thalas

  • 题意

    • 在二维坐标系上,给一个长度为n左下角为0的正方形
    • 现在要求划线,这些线要经过所有正方形覆盖的点,除去(0,0)点
    • 问最少需要画多少条线
  • 题解

    • 横着+竖着划线就是最优解之一,以n=2为例,如图[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6SLyHNCp-1660229480541)(https://s3.bmp.ovh/imgs/2022/08/11/720fc784efe4d33d.png)]
    • 证明上述做法是最优解之一:
  • 代码

#include <iostream>using namespace std;int main() {int t;cin>>t;while(t--) {int n;cin>>n;cout<<2*n<<'\n';}return 0;
}

1001.Theramore

  • 题意

    • 给一个只含01的字符串s,可以进行操作:对任意的奇数长度区间翻转
    • 操作可任意次数,输出s能变成的字典序最小的字符串
  • 题解

    • 贪心看,希望把所有0放在最前,把所有1放在最后。只交换长度为3的区间,那么索引同奇(偶)的可以任意交换,所以可以把奇数下标元素拉出来前面放0后面放1,偶数下标元素同理,最后再拼凑回去就是答案
  • 代码

#include <iostream>
#include <cstring>using namespace std;void solve() {string s;cin>>s;int len=s.size();int odd_zeros=0,zeros=0;for(int i=0;i<len;i++) {//把奇数位的0以及偶数位的0个数记录下来if(s[i]=='0') {zeros++;if(i&1) odd_zeros++;}}int even_zeros=zeros-odd_zeros;string ans="";for(int i=0;i<len;i++) {//从头到尾构造答案,奇数或偶数位能放0就放0,0放完了就都是1了if(i&1) {if(odd_zeros) ans+="0",odd_zeros--;else ans+="1";}else {if(even_zeros) ans+="0",even_zeros--;else ans+="1";}}cout<<ans<<'\n';
}int main() {int t;cin>>t;while(t--) solve();return 0;
}

1011.Stormwind

  • 题意

    • 给一个n*m的矩形,只能横着与竖着切,并且切下去一定贯穿了矩形
    • 问最多可以切多少刀,使得所有切成的小矩形面积不小于k
  • 题解

    • 枚举方法:枚举小长方形。以枚举出来的小长方形为最小切割,计算大长方形最多能切几刀。计算这里注意如果枚举的如果就是小长方形的宽,那么需要再考虑一下n,m互换的结果。如果枚举的就是小长方形的一条边,那么不需要互换n,m
    • 贪心策略:假设固定一边不切,让某一边切的次数尽可能多,然后计算切另一边。一样需要考虑n,m互换对答案的影响
  • 代码

#include <iostream>using namespace std;int t,n,m,k;int main() {cin>>t;while(t--) {cin>>n>>m>>k;int ans=0;for(int x=1;x*x<=k;x++) {int y=(k-1)/x+1;//向上取整if(x<=n&&y<=m) ans=max(ans,(n/x-1)+(m/y-1));//两种切割方式取最大值if(x<=m&&y<=n) ans=max(ans,(m/x-1)+(n/y-1));}cout<<ans<<'\n';}return 0;
}

第二种枚举

#include <iostream>using namespace std;int t,n,m,k;int main() {cin>>t;while(t--) {cin>>n>>m>>k;int res=0;for(int d=1;d<=m;d++) {int h=(k-1)/d+1;if(h>n) continue;res=max(res,(m/d-1)+(n/h-1));}cout<<res<<'\n';}return 0;
}

贪心

#include <iostream>using namespace std;int t,n,m,k;int main() {cin>>t;while(t--) {cin>>n>>m>>k;int res=0;if(n>=k) {//大长方形宽够,那么切成长条形,即让大长方形的长且切足够多次,最多切成1间隔int ans=m-1;//竖着切m-1条ans+=n/k-1;//横着切的条数res=max(res,ans);}else {//宽不够宽肯定不切,找最小的竖着切的间隔int d=(k-1)/n+1;//间隔int ans=m/d-1;//竖着切条数为总条数,而横着不切res=max(res,ans);}swap(n,m);//n,m互换,再来一遍if(n>=k) {int ans=m-1;ans+=n/k-1;res=max(res,ans);}else {int d=(k-1)/n+1;int ans=m/d-1;res=max(res,ans);}cout<<res<<'\n';}return 0;
}

1008.Orgrimmar

  • 题意

    • 给一颗以1为根的树,从中选择x个点,使得所有这些点的度数<=1
    • 求出x的最大值
  • 题解

    • 容易看出是树形dp,涉及到一棵树中选或者不选某些点,同时父子节点还有相互限制
    • 状态定义:
    f[u,0]:以u为根的子树中,不选u,符合条件的最大点数量
    f[u,1]:以u为根的子树中,选择u但不选择子节点连接,符合要求的最大点数量
    f[u,2]:以u为根的子树中,选择u同时选择某一个子节点连接,符合要求的最大点数量
    
    • 状态转移:
    f[u,0]:根节点u不选,那么对于任意的u的子节点都没有限制,对于某一个子节点选择其最大值max(f[v,0],f[v,1],f[v,2]),f[u,0]就是这些子节点最大值的总和f[u,1]:根节点u选择,且不选任意一个子节点,所以从子节点转移过来的话,符合要求的只有所有子节点不选的情况,即f[u,1]=sum(f[v,0]),同时加上自己+1f[u,2]:在选择u的情况下,加上只选某一个子节点连接的限制,先假设点vv是选择连接的那个点,那么壮医过来就是f[u,2]=f[u,1](选择u的情况下)-f[vv,0](vv必选,减去前面加上的f[vv,0])+f[vv,1](选择点vv,同时vv点不能再选择vv的子节点相连接了)+1(同时加上自己)。由式子可得,我们应该找一个f[v,1]-f[v,0]最大的点才会使得f[u,2]最大
    

    f[u,0]=∑v∈childumax(f[v,0],f[v,1],f[v,2])f[u,1]=∑v∈childuf[v,0]+1f[u,2]=∑v∈childuf[v,0]−max(f[v,1]−f[v,0])+1\begin{align*} &f[u,0]=\sum_{v\in child_u}max(f[v,0],f[v,1],f[v,2])\\ &f[u,1]=\sum_{v\in child_u}f[v,0]+1\\ &f[u,2]=\sum_{v\in child_u}f[v,0]-max(f[v,1]-f[v,0])+1 \end{align*} ​f[u,0]=v∈childu​∑​max(f[v,0],f[v,1],f[v,2])f[u,1]=v∈childu​∑​f[v,0]+1f[u,2]=v∈childu​∑​f[v,0]−max(f[v,1]−f[v,0])+1​

  • 代码

#include <iostream>using namespace std;
const int N=5e5+10;int t,n;
int h[N],e[2*N],ne[2*N],idx;//无向边,开两倍
int f[N][3];void add(int a,int b) {//加边e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}void dfs(int u,int fa) {//找到以u为根的,所求的三种情况的最值int mx0=0,mx1=0,mx2=0;for(int i=h[u];~i;i=ne[i]) {int j=e[i];if(j==fa) continue;//链的是父节点跳过dfs(j,u);//递归计算子节点mx0+=max(max(f[j][0],f[j][1]),f[j][2]);//状态转移mx1+=f[j][0];mx2=max(mx2,f[j][1]-f[j][0]);}f[u][0]=mx0;f[u][1]=mx1+1;f[u][2]=mx1+mx2+1;
}void solve() {cin>>n;idx=0;//清空初始化for(int i=1;i<=n;i++) h[i]=-1,f[i][0]=0,f[i][1]=0,f[i][2]=0;//清空初始化,谨防memset超时for(int i=1;i<n;i++) {int a,b;cin>>a>>b;add(a,b);add(b,a);//无向边}dfs(1,0);cout<<max(max(f[1][0],f[1][1]),f[1][2])<<'\n';
}int main() {int size(512<<20);  // 512M__asm__ ( "movq %0, %%rsp\n"::"r"((char*)malloc(size)+size));ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>t;while(t--) solve();exit(0);
}

1005.Ironforge

  • 题意

  • 题解
    *

  • 代码


2022杭电多校赛第八场相关推荐

  1. 2022杭电多校联赛第八场 题解

    比赛传送门 作者: fn 目录 签到题 1004题 Quel'Thalas / 奎尔萨拉斯(幻方) 1001题 Theramore / 塞拉摩岛(翻转字符串) 基本题 1011题 Stormwind ...

  2. 2022杭电多校第八场题解

    2022杭电多校第八场 Theramore(思维) 题意 给定一个01字符串,每次可以将一个奇数长度的区间翻转,求操作后字典序最小的字符串. 分析 翻转奇数长度的区间,元素位置的奇偶性不变,统计奇数位 ...

  3. 2022杭电多校(四)

    2022杭电多校(四) 文章目录 2022杭电多校(四) 一.比赛小结 二.题目分析及解法(基础题) 1001.Link with Bracket Sequence II 1002.Link with ...

  4. 2022杭电多校(一)

    2022杭电多校(一) 文章目录 2022杭电多校(一) 一.比赛小结 二.题目分析及解法(基础题) 1001.String 1002.Dragon slayer 1003.BackPack 1004 ...

  5. 2022杭电多校(十)

    2022杭电多校(十) 文章目录 2022杭电多校(十) 一.比赛小结 二.题目分析及解法(基础题) 1001.Winner Prediction 1003.Wavy Tree 1004.Averag ...

  6. 2022杭电多校(九)

    2022杭电多校(九) 文章目录 2022杭电多校(九) 一.比赛小结 二.题目分析及解法(基础题) 1001.Arithmetic Subsequence 1003.Fast Bubble Sort ...

  7. 2022杭电多校(二)

    2022杭电多校(二) 文章目录 2022杭电多校(二) 一.比赛小结 二.题目分析及解法(基础题) 1001.Static Query on Tree 1002.C++ to Python 1003 ...

  8. 2022杭电多校(五)

    2022杭电多校(五) 文章目录 2022杭电多校(五) 一.比赛小结 二.题目分析及解法(基础题) 1003.Slipper 1006.BBQ 1007.Count Set 1010.Braggin ...

  9. 2022杭电多校(三)

    2022杭电多校(三) 文章目录 2022杭电多校(三) 一.比赛小结 二.题目分析及解法(基础题) 1001.Equipment Upgrade 1002.Boss Rush 1003.Cyber ...

最新文章

  1. 【LeetCode OJ】Same Tree
  2. Android 开机自动运行和添加删除桌面快捷方式
  3. 域服务器可以修改ip,Windows Server 2016 域控制器修改IP
  4. SAP UI5 extend debug
  5. C++map容器应用举例
  6. java学习(51):上转型对象
  7. play 应用商店_如何在Play商店中发布应用程序
  8. Vue指令之v-bind
  9. ZeroMQ之Request/Response (Java)
  10. Studio 3T for MongoDB 破解教程
  11. 联想电脑无法调节屏幕亮度
  12. 建议5:防止switch贯穿
  13. 三分钟带你了解,什么是地理信息系统(GIS)
  14. 迪斯尼电影经典台词精选
  15. PUN2多人联网之房间选择、创建房间
  16. 计算机学院青年教师讲课,【教学动态】计算机科学与信息工程学院举办首届中青年教师讲课大赛...
  17. 小程序 php cookie,微信小程序模拟 cookie
  18. 最全的解酒方法-----让你千杯不...
  19. 每日安全简讯20160719
  20. 求解点关于直线的距离、垂足、对称点公式

热门文章

  1. Makefile文件是什么
  2. linux文件系统的基本特征,Linux文件系统的基本结构
  3. 三菱触摸屏通讯错误_三菱触摸屏插上通讯线直接黑屏,老司机手把手教你解决触摸屏黑屏...
  4. android系统如何获得外置卡路径
  5. html判断是否为ie浏览器,js判断IE浏览器(包括IE11)
  6. 删除mysql中的函数
  7. C++primer学习:关于upper_bound和lower_bound的探究.
  8. 我的2020推免之路:清叉、TBSI、贵系、中山、国防科大、自动化所
  9. 【SQL Server】grant, revoke, deny介绍及相关问题
  10. 360度全景的地拍如何制作?