博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Nowcoder】玩游戏
阅读量:5139 次
发布时间:2019-06-13

本文共 2040 字,大约阅读时间需要 6 分钟。

Solution

  所以说这是一道==纯粹的人类智慧题是这样吗qwq

​  一开始的时候想sg函数qwq然后发现。。好像根本不能拆成独立的子游戏嘛qwq

  

  换一个角度来思考:首先考虑一下这个图的性质

  因为这是一个简单无向图,然后除了起点和终点以外没有度数\(>2\)的点,也就是说不可能出现走到一个点之后出现分叉路这样的情况,更加具体一点就是:这个图中从\(1\)\(n\)的路径都是互不相交的

  注意到因为每次操作都是\(-1\),所以不管怎么操作一定能够得到一个这样的局面:只剩下一条从\(1\)\(n\)的路径,并且这条路径上的每条边的边权都是\(1\),因为必须要进行一次操作,所以碰上这种局面的那个人必败

  这个时候我们就可以得到一个比较直接的策略了:两个人都要尽可能地避免自己碰上种局面(为了方便表述,后面将这种只剩一条全\(1\)路的局面称为“结束局面”),也就是说,要尽早将自己会遇上的可能成为这种局面的\(1\)\(n\)的路径断掉,断掉一条\(1\)\(n\) 路径的最少操作次数为这条路径上的边权最小值,所以我们要做的就是,找出每条从\(1\)\(n\)的路径,判断如果最后剩下的那条全是\(1\)的路是这条的话,会是谁要进行操作(也就是判断这条路径对谁来说必败),然后将断掉这条路径所需的的最少次数加到对应的那个人的统计变量中,最后只要判断一下两个统计变量的大小,就可以知道是谁先破坏完自己的必败路径了(也就是对方的必胜路径),先破坏完的那个人就是有必胜策略的

  最后的问题就是如何判断一条路径对谁来说必败:注意到一个比较明显但是又很容易忽略的性质(比如说我就忽略了==),因为每次操作的时候都是\(-1\),所以先手操作完之后剩余边权之和与原边权和的奇偶性是不同的,后手操作完之后则一定是相同的,如果说一条路径是“结束局面”中剩的那条路径,那么这条路径包含的边的数量就是该局面的边权之和(因为根据定义结束局面中所有的边权都是\(1\)),所以我们可以直接通过这个以及一开始还没有进行任何操作时总的边权和的奇偶性来判断,如果奇偶性相同说明会是后手碰上,否则是先手碰上

  然后因为这题对图的约束,边数什么的不会很多,\(1\)\(n\)的路径总数也不会很多,所以我们直接爆搜一下统计一下就好了

  

  mark:尝试从奇偶性的角度分析问题的时候。。不妨想一下剩余局面,比如说这题就是:先手操作完之后剩余边权之和与原边权和的奇偶性是不同的,后手操作完之后则一定是相同的
  
  
​  代码大概长这个样子

#include
#include
#include
#define ll long longusing namespace std;const int N=1e5+10,inf=2147483647;struct xxx{ int y,nxt,dis;}a[N*2];int h[N];ll cnt[2];int n,m,tot;ll sum;void add(int x,int y,int d){a[++tot].y=y; a[tot].nxt=h[x]; h[x]=tot; a[tot].dis=d;}void dfs(int pre,int x,int who,int mn){ int u; if (x==n){ cnt[who]+=mn; return; } for (int i=h[x];i!=-1;i=a[i].nxt){ u=a[i].y; if (i==(pre^1)) continue; dfs(i,u,who^1,min(mn,a[i].dis)); }}int main(){#ifndef ONLINE_JUDGE freopen("a.in","r",stdin);#endif int x,y,z; scanf("%d%d",&n,&m); memset(h,-1,sizeof(h)); tot=1; sum=0; for (int i=1;i<=m;++i){ scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); sum+=z; } dfs(0,1,0,inf); --sum; if (cnt[sum&1]>cnt[sum&1^1]) printf("Yes\n"); else printf("No\n");}

转载于:https://www.cnblogs.com/yoyoball/p/9732249.html

你可能感兴趣的文章
BitmapData.noise示例
查看>>
肤色阈值分割
查看>>
Android中的菜单
查看>>
【最短路】Vijos P1046 观光旅游
查看>>
Android学习总结——开篇
查看>>
iOS 基础知识
查看>>
PHP 重新格式化var_dump/print_r打印的数组
查看>>
C++11:POD数据类型
查看>>
Delphi中Json格式读写
查看>>
请不要忘记带着梦想时常沐浴阳光
查看>>
交易与风险
查看>>
Hibernate: Could not find a getter for iUserId in class com.Hibernate.pojo.User异常
查看>>
windows环境下搭建RocketMQ
查看>>
CSS--基础
查看>>
基于OpenGL的渲染引擎
查看>>
Android HTTP GET 小文件下载
查看>>
ember.js:使用笔记4 数组数据的分组显示
查看>>
mvc-9测试和调试
查看>>
移植linux-2.6.32.2到qq2440
查看>>
转义字符(\)对JavaScript中JSON.parse的影响概述
查看>>