题目链接: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的,一下子简单许多。那么就直接放一下他的代码好了(他的叉乘判断顺逆时针方法习惯和我的有点不同,但本质是一样的):

 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)相关推荐

  1. 2015 HIAST Collegiate Programming Contest J

    Polygons Intersection 题意:给2个凸多边形,求相交面积 思路:不会,套板子就是了 AC代码: #include "iostream" #include &qu ...

  2. 2015 German Collegiate Programming Contest (GCPC 15)

    2015 German Collegiate Programming Contest (GCPC 15) B. Bounty Hunter II 给定一张DAG,求一种方案:用最少的路径将所有点覆盖. ...

  3. 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 ...

  4. (寒假开黑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 ...

  5. 2018 German Collegiate Programming Contest (GCPC 18)

    2018 German Collegiate Programming Contest (GCPC 18) Attack on Alpha-Zet 建树,求lca 代码: #include <al ...

  6. 2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017)

    D.Distinctive Character 看到样例,第一个反应贪心.先写了个按这一位1和0的数目多少,确定0还是1的东西.感觉不够真,又写了个尽量加到相似的比较小的串上的贪心.在和前边的那个组合 ...

  7. 2016 China Collegiate Programming Contest Final

    2016 China Collegiate Programming Contest Final Table of Contents 2016 China Collegiate Programming ...

  8. 【The 13th Chinese Northeast Collegiate Programming Contest】I. Temperature Survey

    题目描述 [题目链接](https://codeforces.com/gym/102220/problem/I) 给定长度为 $n$ 的 $a$ 序列,保证 $a_n \le n$,求有多少个长度为 ...

  9. (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest

    layout: post title: (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest author: "luow ...

  10. (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题)

    layout: post title: (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题) author: " ...

最新文章

  1. R语言构建xgboost文本分类模型(bag of words):xgb.cv函数交叉验证确定xgboost模型的最优子树个数、交叉验证获取最优子树之后构建最优xgboost模型并评估模型文本分类效能
  2. block的一些注意事项
  3. 天线决定接受频率_对讲机天线到底有多重要?通讯效果好不好要靠它!
  4. 牛逼哄哄的SLAM技术 即将颠覆哪些领域?
  5. java fork join原理_Java并发Fork-Join框架原理解析
  6. Caffe代码导读(4):数据集准备
  7. CISC-235 Fall 2018 Assignment
  8. Rest Framework
  9. 交换机连接控制器_DELL MD3200I存储单双控制器的自由切换
  10. grep -i pattern files :不区分大小写地搜索。默认情况区分大小写,
  11. L1-036 A乘以B (5 分)—团体程序设计天梯赛
  12. java numberformat异常_java – 解析货币值失败的NumberFormat
  13. APICloud 上传文件到云数据库2.0的代码实现
  14. P236 练习1 声明另一个类的变量当属性
  15. java静态代码块,构造代码块,构造函数,mian()代码执行顺序详细分析
  16. 保温杯内壁有很多小泡泡
  17. CUDA软件架构—网格(Grid)、线程块(Block)和线程(Thread)的组织关系以及线程索引的计算公式
  18. 两种常用癌症免疫疗法CAR-T与TCR-T的联系和区别
  19. 很久以前看到的很经典的小说
  20. 保险巨头安联将测试代币用于内部资金流转

热门文章

  1. 磨刀不误砍柴工—ElasticSearch的schema详解
  2. flutter之从零开始搭建(三)之 网络请求
  3. 实战用Python+Pygame+Kivy(Buildozer)+Ubuntu开发安卓android手机端apk游戏及踩坑分享
  4. C++程序设计谭浩强 第三章(程序设计初步)习题答案(部分有改进)
  5. 制度罚则-- 线下Bug规范
  6. HDU—— 2567 寻梦
  7. Excel VLOOKUP实用教程之 08 VLOOKUP如果实现区分大小写的查找?(教程含数据excel)
  8. Cognos函数(二十二) - ancestor
  9. 10099 - The Tourist Guide
  10. 网工必会stp /rstp /mstp (笔记)