ACM-ICPC 2018 南京网络赛
题目顺序:A C E G I J L
A. An Olympian Math Problem
打表,找规律,发现答案为n-1
C. GDY
题意:
m张卡片,标号1-13;
n个玩家,标号1-n;每个人拿前5个卡片
玩家1先出牌(最小),其他玩家2-n顺时针标号从1-n-1出牌
轮到当前玩家出牌,如果有比上一次的出牌大1,可以直接出;没有大1的牌,若有2出2;若都没有,这一轮跳过他
如果一轮中,玩家x出了一张最大的牌,玩家xn,1x中所有玩家都没有出牌,从玩家x开始所有玩家都拿一张牌(如
果没有牌了就不拿了),然后玩家x打出最小牌。
1个人最先没牌了,他就win了;
其他人计算惩罚 = sum(手中牌的数字标号)
题解:180行大模拟。。改了一个多小时的bug,然后AC了23333
E. AC Challenge
题意:共n个problem,要去选择1~n中的几个problem,其中每个方案有si个前提问题必选,分别是p1,p2...pn;
回答一个问题会得到 t×ai+bi 分数,其中t表示回答的第t个问题。
题解:状压dp;先看数据量,n<20,即可想到用状压,枚举选定方案状态 共0~1<<n个,对于每个状态,判断是否满足每一个问题的前提条件。若满足,就更新dp数组
G. Lpl and Energy-saving Lamps
比较简单的数据结构题
题意:每个月买m盏新的灯,共n个房间。每个月按照房间号从小到大的顺序(1~n),找到手中的灯数量 >= 房间所需灯的数量,循环至手中灯的数量不足(<所有房间所需的灯) ;
题解:线段树区间查询 + 单点更新,维护区间最小值;
因为每个月只需要按照房间号从小到到,找到 比 手中的灯数k小的房间,而线段树维护的区间最小值可以 以O(logn)的时间找到该房间;
找到该房间后需要将房间所需灯数设置为inf,代表该房间已经装好了,以便后面查找,即线段树单点更新。
I. Skr
题意:给定一个字符串(仅含有数字字符),计算所有回文子串的和。
题解:马拉车manacher + 字符串hash
首先马拉车算法过程中已经找到了 所有回文子串,但是会有重复
所有我们就要用字符串hash来存储已经找到的回文子串,在下次马拉车过程中出现相同的回文串时,判重。
*J. Sum
题意:拆分整数成因数的乘积,若这个整数的因数 含有 平方数(或者幂>=2),就不合法;每个数有确定的拆分方案个数,f(i)表示整数i的拆分方案个数,让我计算前n项f(i)的和
题解:题目数据 n <= 2*10^7,所以不能用O(nlogn)的筛,只能用O(n)的筛,这里用欧拉筛,
L. Magical Girl Haze
题意:n个城市,m条路,每条路距离ci,一个人住在城市1,要去城市n,他可以使k条路的边权距离为0,问最短路
题解:分层图模板题,拆点后,跑最短路。
如何拆点:依照题意,可以让k条路边权为0,那么我们就建立K层图,把每个边对应的两个城市点u和v+n,u+n 和 v+2n ,u+2n和v+3n......连一条权值为0的边。并且相同层u+kn和v+kn连上权值为原ci的边
即:若原图中i~j有一条权值为x的边,则
add_edge(i,j,x),add_edge(i+n,j+n,x).....add_edge(i+kn,j+kn,x)
add_edge(i,j+n,0),add_edge(i+n,j+2n,0)....add_edge(i+(k-1)n,j+k*n,0)
这样拆点后,使一条边为0,就变成了向上走了一层,走了一条权值为0的边。
建完图后跑dijkstra。