QZHWTEST2021.5.23分析
树上游戏
题面
题目描述
\(FLY\)和朋友玩一个游戏。
在一棵树上,每个点都有一个点权,\(FLY\)和朋友从根开始,轮流取出点权作为分值,并且由当前玩家选择前往哪一个儿子,直到到达叶子节点后计算总分,总分大的胜。
\(FLY\)和他的朋友都非常谨慎,能够每次选择儿子都做到理论上的最优值,请你判断游戏是否有先手必胜的策略。
输入
第一行输入数据组数\(T\)
第二行输入树的点数\(n\)
第三行\(n\)个数字,为每个点的点权
接下来\(n-1\)行输入树边\(u\),\(v\)
输出
若先手必胜,则输出\(win\)
若先手必败,则输出\(loss\)
若必定平局,则输出\(draw\)
样例输入
2
5
3 4 2 3 2
1 2
2 3
2 4
4 5
5
4 1 4 3 3
1 2
2 3
3 4
4 5
样例输出
draw
win
思路
看到题目,直接打爆搜,回溯时优化成树形\(DP\),复杂度\(O(NT)\)。
在搜索时,记录当前节点的深度\(depth\),这可以帮助我们知道现在轮到谁了。我用的是\(flag\)记录,对应意思代码中有。
每个节点搜索每一个孩子,一直搜到叶子。到叶子后,判断此时先后手谁分多,回溯到上一个节点,最后输出结果即可。
但是你会发现,样例的第一组都过不去。原因是这样的:

由图,在节点\(2\)时,如果向\(3\)走,先手胜;如果向\(4\)走,平局。因为此时是后手选,根据最优策略,故他一定会选\(4\)。因此,我们要在每次回溯时判断是谁选择,先手应取尽量好的,后手应取对后手尽量好的。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100005
using namespace std;
int t,n,ans;//ans=0表示输,1表示平,2表示胜
int a[maxn],uu,vv;
int head[maxn],w=0;
struct gragh{
int to,nex;
}g[maxn*2];
int tot[2];//0先手,1后手
void clear(){
w=0;ans=-1;
memset(a,0,sizeof(a));
memset(g,0,sizeof(g));
memset(tot,0,sizeof(tot));
memset(head,0,sizeof(head));
}
void add(int x,int y){
g[++w].to=y;
g[w].nex=head[x];
head[x]=w;
}
int dfs(int i,int fa,bool flag){
int anss=-1;
bool flag2=0;
tot[flag]+=a[i];
for(int j=head[i];j!=0;j=g[j].nex){
if(g[j].to==fa){
continue;
}
flag2=1;
int x=dfs(g[j].to,i,!flag);
if(!flag){//FLY
anss=(anss==-1?x:max(x,anss));
}else{
anss=(anss==-1?x:min(x,anss));
}
}
if(!flag2){//叶子
if(tot[0]>tot[1]){
anss=2;
}else if(tot[0]==tot[1]){
anss=1;
}else{
anss=0;
}
}
tot[flag]-=a[i];
return anss;
}
int main(){
scanf("%d",&t);
while(t--){
clear();
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<n;i++){
scanf("%d%d",&uu,&vv);
add(uu,vv);
add(vv,uu);
}
ans=dfs(1,-1,0);
if(ans==0){
printf("loss\n");
}else if(ans==1){
printf("draw\n");
}else{
printf("win\n");
}
}
return 0;
}
无线通讯网 & 洛谷P1991
题面
题目描述
国防部计划用无线网络连接若干个边防哨所。\(2\)种不同的通讯技术用来搭建无线网络;
每个边防哨所都要配备无线电收发器;有一些哨所还可以增配卫星电话。
任意两个配备了一条卫星电话线路的哨所(两边都有卫星电话)均可以通话,无论他们相距多远。而只通过无线电收发器通话的哨所之间的距离不能超过\(D\),这是受收发器的功率限制。收发器的功率越高,通话距离\(D\)会更远,但同时价格也会更贵。
收发器需要统一购买和安装,所以全部哨所只能选择安装一种型号的收发器。换句话说,每一对哨所之间的通话距离都是同一个\(D\)。你的任务是确定收发器必须的最小通话距离\(D\),使得每一对哨所之间至少有一条通话路径(直接的或者间接的)。
输入
第\(1\)行:\(2\)个整数\(S\)(\(1\le S\le 100\))和\(P\)(\(S<P\le 500\)),\(S\)表示可安装的卫星电话的哨所数,\(P\)表示边防哨所的数量。
接下里\(P\)行,每行描述一个哨所的平面坐标(\(x,y\)),以\(km\)为单位,整数,\(0\le x,y\le 10000\)。
输出
\(1\)个实数\(D\),表示无线电收发器的最小传输距离。精确到小数点后两位。
样例输入
2 4
0 100
0 300
0 600
150 750
样例输出
212.13
思路
题目中说到“直接或者间接连通”与“求最小通话距离”,这很容易让我们想到最小生成树。枚举每两个点,计算出距离\(dis\),然后排序,建立最小生成树,输出最大边即可。
需注意的是,题中有给到 卫星电话 这个东西,可以任两点无条件直接连通。考虑到最小生成树要连接\(n-1\)条边,而 卫星电话 可以随便连\(s-1\)条边,故我们只需要枚举最小的\(n-s\)(即\(n-1-(s-1)\))条边即可,剩下的\(s-1\)条较长的边用 卫星电话 即可。
代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define maxp 505
using namespace std;
int s,p;
struct node{
int x,y;
}a[maxp];
int w=0;
struct line{
int x,y;
double len;
}l[maxp*maxp];
double dis(int p1,int p2){
return sqrt(pow(a[p1].x-a[p2].x,2)+pow(a[p1].y-a[p2].y,2));
}
bool cmp(line a,line b){
return a.len<b.len;
}
int f[maxp];
int find(int x){
if(f[x]==x){
return x;
}
return f[x]=find(f[x]);
}
int main(){
scanf("%d%d",&s,&p);
for(int i=1;i<=p;i++){
scanf("%d%d",&a[i].x,&a[i].y);
f[i]=i;
}
for(int i=1;i<=p;i++){
for(int j=1;j<i;j++){
l[++w].x=i;
l[w].y=j;
l[w].len=dis(i,j);
}
}
sort(l+1,l+1+w,cmp);
int tot=0;
double ans=-1;
for(int i=1;i<=w;i++){
int r1=find(l[i].x),r2=find(l[i].y);
if(r1!=r2){
f[r2]=r1;
tot++;
ans=l[i].len;
}
if(tot==p-s){
printf("%.2f",ans);
return 0;
}
}
return 0;
}
/*
2 4
0 100
0 300
0 600
150 750
*/
仙人掌 & 洛谷P3687
题面
题目描述
如果一个无自环无重边无向连通图的任意一条边最多属于一个简单环,我们就称之为仙人掌。所谓简单环即不经过重复的结点的环。

现在九条可怜手上有一张无自环无重边的无向连通图,但是她觉得这张图中的边数太少了,所以她想要在图上连上一些新的边。同时为了方便的存储这张无向图,图中的边数又不能太多。
经过权衡,她想要加边后得到的图为一棵仙人掌。
不难发现合法的加边方案有很多,可怜想要知道总共有多少不同的加边方案。
两个加边方案是不同的当且仅当一个方案中存在一条另一个方案中没有的边。
输入
多组数据,第一行输入一个整数\(T\)表示数据组数。
每组数据第一行输入两个整数\(n\),\(m\),表示图中的点数与边数。
接下来\(m\)行,每行两个整数\(u\),\(v\)(\(1\le u,v\le n\),\(u\ne v\)) 表示图中的一条边。保证输入的图联通且没有自环与重边。
输出
对于每组数据,输出一个整数表示方案数,当然方案数可能很大,请对\(998244353\)取模后输出。
样例输入
2
3 2
1 2
1 3
5 4
1 2
2 3
2 4
1 5
样例输出
2
8
思路
无
代码
无
QZHWTEST2021.5.23分析的更多相关文章
- Remove Duplicates from Sorted List II
Remove Duplicates from Sorted List II Given a sorted linked list, delete all nodes that have duplica ...
- JAVA课程实验报告 实验三 敏捷开发与XP实践
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1353 姓名:韩玉琪 学号:20135317 成绩: 指导教师:娄嘉 ...
- Remove Duplicates from Sorted List | & ||
Remove Duplicates from Sorted List I Given a sorted linked list, delete all duplicates such that eac ...
- Android 中解析 JSON
有什么不懂的可以去官网去看看:www.json.org 在google android中也有关于解析JSON的类库:JsonReader,但是只能在3.0以后的版本中才可以用,在这里我们用google ...
- 洛谷P1113 杂物
P1113 杂务 251通过 441提交 题目提供者该用户不存在 标签图论递推 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 为什么会只有10分? 题目描述 John的农场在给奶牛挤奶前有很 ...
- 【solr专题之三】Solr常见异常
1.RemoteSolrException: Expected mime type application/octet-stream but got text/html 现象: SLF4J: Fail ...
- shu_1186 字符排列问题
cid=1079&pid=23">http://202.121.199.212/JudgeOnline/problem.php?cid=1079&pid=23 分析: ...
- java并发之线程同步(synchronized和锁机制)
使用synchronized实现同步方法 使用非依赖属性实现同步 在同步块中使用条件(wait(),notify(),notifyAll()) 使用锁实现同步 使用读写锁实现同步数据访问 修改锁的公平 ...
- 2018-2019-2 20175235 实验二《Java面向对象程序设计》实验报告
实验内容: 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 一.单元测试 1伪代码 百 ...
随机推荐
- linux学习之路第二天(xshell和xftp的使用图解)
以上xshell的连接过程 2.远程上传和下载文件xftp6 一定要换成22和sftp,否则连接不上 如果出现中文乱码的情况 先点击那个小齿轮 再点击选项 把编码编程UTF-8就ok了
- php漏洞 strcmp漏洞
0x01: 背景:strcmp函数,参数是两个字符串,相等返回为零,大于,返回大于零,小于,返回小于零. 0x02: 如果传入的值,不是字符串的话,会报错,同时使得两个字符串直接相等,返回为零. 一般 ...
- echarts堆叠柱状图在最上面的柱子显示总和
需求 柱子需设置barMinHeight 在堆叠柱状图的最上面显示当前堆叠的总和 直接上代码吧 需要注意:设置barMinHeight时为了让0不显示,只能将0设置为null; 设置为null的柱子l ...
- linux挂载光驱
挂载光驱到linux中.linux的镜像盘中有安装oracle的所有的软件包,可以会用yum一键安装. 1.此时的linux的界面显示光驱图标 2.挂载 因为光盘里面的文件是只读模式的,yum安装时不 ...
- NTP配置(广播模式并且无认证)
1.服务器端 1.1服务器本地同步自己的时钟,否则无法对外提供NTP服务 [NTP]ntp refclock-master 3 [NTP]ntp refclock-master 127.127.1.1 ...
- Selenium启动Firefox示例(java版)
本文示例使用selenium启动Firefox,并将浏览器窗口最大化,在百度搜索框内输入"HelloWorld",最后点击搜索按钮. 源代码如下: 1 package com.se ...
- 前端-HTML基础+CSS基础
.pg-header { height: 48px; text-align: center; line-height: 48px; background-color: rgba(127, 255, 2 ...
- Antilibrary能拯救稍后不读吗
从「稍后再读」到「再也不读」 上学时,我有一套自认为很高效的资料搜集工作流.大致流程是浏览到感兴趣或可能有用的信息时,粗略扫过一眼后即用 Pocket 将其保存为稍后再读,随后借助 IFTTT 的某个 ...
- Java基础00-数组9
1. 数组定义格式 1.1 数组概述 1.2 什么是数组 1.3 数组定义格式 推荐使用第一种格式,因为第一种格式读法比较顺畅. 2. 数组初始化之动态初始化 2.1 数组初始化概述 2.2 数组初始 ...
- springboot-4-CRUD开发实战
流程: 创建项目,勾选基本的几个开发工具还有webstarter 再创建包(service,control,config,dao,pojo) 再前往https://www.webjars.org/,选 ...