Egyptian Collegiate Programming Contest (ECPC 2015)
题目链接:https://vjudge.net/contest/155219#overview。
A题,用全排列来找出比当前这个数字字典序还大的排列有几个,然后前缀和dp即可。据说可以康拓展开来快速找出前面需要实现的要求。
B题,水题。
C题,感觉数据比较水。做法是dsu+lca,但是为了实现lca树的结构不被破坏,dsu::find()不能压缩路径。然后线性找lca没T也是有点神奇。
D题,dfs即可。
E题,dp[i][j][k],表示到了(i,j)并且已经吃了k个2,最多吃了几个3的状态。最后遍历一下dp[n][m][...]找出答案即可。
F题,水题。
G题,二分答案,然后跑dij即可。很久没写dij,刚开始竟然忘了优先队列要写一个greater..
H题,不会= =。
I题,水题。
J题,刚开始想了一个比较麻烦的方法,不需要考虑dfs的时候当前步是谁的做法,然后WA了。然后加上就可以了,还好写很多。不用记忆化搜索也能够过。
K题,dp[i][j]表示计算到i位,%p答案是j的种类数。然后滚动数组一下再一位一位dp即可。之所以dp[pre][0]每次都需要先+1是因为,之前是空串也算是一个0,换言之,只有当前这位数字%p是0也是可以的。
L题,这个博弈论构造起来好麻烦(虽然最终代码很简单)。。首先注意到随着个数的增加,一堆是必胜堆还是必败堆是交替变化的。必胜态考虑完了要考虑必败态的话,必败态的L肯定是上一个必胜态的R+1。然后因为必败态的任意一种选择都是必胜态,因此必败态的最大堆是上一个必胜态的R,然后其他堆都是1,如此不能再多了(因为再多一个,放在最大堆上,最大堆上就变成了必败态,这和必败态的定义不符合),因此这个必败态的R是是上一个必胜态的R+(n-1)。那么再考虑下一个必胜态,必胜态的定义是只要有一种方法能到达必败态即可,因此最大堆是上一个必败态的R,其他的先不妨设置为1,然后同样的考虑再增加一个,因为当前选择者肯定不会傻到放到最大堆上(这样的话最大堆就变成必胜态了),那么只能放到其他堆,这样的状况一直会持续到其他n-1个堆都是n-1(不能再多了,因为n是必胜态),这是临界值,所以这个必胜态的R值是上一个必败态的R再加上(n-1)*(n-1)。如此交替即可,那么给定一个x一定能够知道这是必胜堆还是必败堆。最后对于先手者,只要有一堆是必胜的,选择它即可。
M题,比赛的时候搞了半天,最后因为写起来好麻烦就放弃了。看了一下仓鼠的代码是dp的,一下子简单许多。那么就直接放一下他的代码好了(他的叉乘判断顺逆时针方法习惯和我的有点不同,但本质是一样的):
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include <bits/stdc++.h> 2 #define x first 3 #define y second 4 using namespace std; 5 typedef pair<int,int> pii; 6 const int N = 1000 + 5; 7 const double inf = 1e18; 8 9 pii p[N]; 10 int st[N], tot; 11 int n; 12 double dp[N]; 13 14 // k->i, k->j 15 bool cross(int i,int j,int k) 16 { 17 pii pa = pii(p[i].x-p[k].x, p[i].y-p[k].y); 18 pii pb = pii(p[j].x-p[k].x, p[j].y-p[k].y); 19 return 1LL*pa.x*pb.y - 1LL*pb.x*pa.y > 0; 20 } 21 double dis(int i,int j) 22 { 23 double xx = p[i].x - p[j].x; 24 double yy = p[i].y - p[j].y; 25 return sqrt(xx*xx + yy*yy); 26 } 27 28 int main() 29 { 30 int T; 31 cin >> T; 32 while(T--) 33 { 34 scanf("%d",&n); 35 for(int i=1;i<=n;i++) scanf("%d%d",&p[i].x,&p[i].y); 36 dp[0] = 0; 37 dp[1] = inf; 38 for(int i=2;i<=n;i++) 39 { 40 dp[i] = inf; 41 tot = 0; 42 43 for(int j=i;j>0;j--) 44 { 45 // 如果储备点大于两个并且存在凹进去的部分,去掉那部分 46 while(tot > 1 && cross(j,st[tot-1],st[tot-2])) tot--; 47 // 如果只有一个储备点,那么是可以直接更新答案的,要注意的是,中间的线段是可以选择去掉的。 48 // 包含第一个点和最后一个点的段是不能被去掉的,所以dp[1]=inf,且dis(i,j)必须存在。 49 if(tot == 1) dp[i] = min(dp[i], min(dp[j-1], dp[j]) + dis(i,j)); 50 st[tot++] = j; 51 } 52 } 53 printf("%.6f\n",dp[n]); 54 } 55 return 0; 56 }
M题
转载于:https://www.cnblogs.com/zzyDS/p/6622191.html
Egyptian Collegiate Programming Contest (ECPC 2015)相关推荐
- 2015 HIAST Collegiate Programming Contest J
Polygons Intersection 题意:给2个凸多边形,求相交面积 思路:不会,套板子就是了 AC代码: #include "iostream" #include &qu ...
- 2015 German Collegiate Programming Contest (GCPC 15)
2015 German Collegiate Programming Contest (GCPC 15) B. Bounty Hunter II 给定一张DAG,求一种方案:用最少的路径将所有点覆盖. ...
- 2015 ACM Arabella Collegiate Programming Contest(F题)
F. Palindrome [ Color: Pink ] A string is palindrome if it can be read the same way in either direct ...
- (寒假开黑gym)2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)
layout: post title: (寒假开黑gym)2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017) au ...
- 2018 German Collegiate Programming Contest (GCPC 18)
2018 German Collegiate Programming Contest (GCPC 18) Attack on Alpha-Zet 建树,求lca 代码: #include <al ...
- 2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017)
D.Distinctive Character 看到样例,第一个反应贪心.先写了个按这一位1和0的数目多少,确定0还是1的东西.感觉不够真,又写了个尽量加到相似的比较小的串上的贪心.在和前边的那个组合 ...
- 2016 China Collegiate Programming Contest Final
2016 China Collegiate Programming Contest Final Table of Contents 2016 China Collegiate Programming ...
- 【The 13th Chinese Northeast Collegiate Programming Contest】I. Temperature Survey
题目描述 [题目链接](https://codeforces.com/gym/102220/problem/I) 给定长度为 $n$ 的 $a$ 序列,保证 $a_n \le n$,求有多少个长度为 ...
- (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest
layout: post title: (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest author: "luow ...
- (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题)
layout: post title: (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题) author: " ...
最新文章
- R语言构建xgboost文本分类模型(bag of words):xgb.cv函数交叉验证确定xgboost模型的最优子树个数、交叉验证获取最优子树之后构建最优xgboost模型并评估模型文本分类效能
- block的一些注意事项
- 天线决定接受频率_对讲机天线到底有多重要?通讯效果好不好要靠它!
- 牛逼哄哄的SLAM技术 即将颠覆哪些领域?
- java fork join原理_Java并发Fork-Join框架原理解析
- Caffe代码导读(4):数据集准备
- CISC-235 Fall 2018 Assignment
- Rest Framework
- 交换机连接控制器_DELL MD3200I存储单双控制器的自由切换
- grep -i pattern files :不区分大小写地搜索。默认情况区分大小写,
- L1-036 A乘以B (5 分)—团体程序设计天梯赛
- java numberformat异常_java – 解析货币值失败的NumberFormat
- APICloud 上传文件到云数据库2.0的代码实现
- P236 练习1 声明另一个类的变量当属性
- java静态代码块,构造代码块,构造函数,mian()代码执行顺序详细分析
- 保温杯内壁有很多小泡泡
- CUDA软件架构—网格(Grid)、线程块(Block)和线程(Thread)的组织关系以及线程索引的计算公式
- 两种常用癌症免疫疗法CAR-T与TCR-T的联系和区别
- 很久以前看到的很经典的小说
- 保险巨头安联将测试代币用于内部资金流转
热门文章
- 磨刀不误砍柴工—ElasticSearch的schema详解
- flutter之从零开始搭建(三)之 网络请求
- 实战用Python+Pygame+Kivy(Buildozer)+Ubuntu开发安卓android手机端apk游戏及踩坑分享
- C++程序设计谭浩强 第三章(程序设计初步)习题答案(部分有改进)
- 制度罚则-- 线下Bug规范
- HDU—— 2567 寻梦
- Excel VLOOKUP实用教程之 08 VLOOKUP如果实现区分大小写的查找?(教程含数据excel)
- Cognos函数(二十二) - ancestor
- 10099 - The Tourist Guide
- 网工必会stp /rstp /mstp (笔记)