1001,水题,直接模拟即可。比赛中开局连wa三发,因为把int写成了bool..

  1002,积分题,比赛中找到了下面这个积分公式,

  但是并没什么用,,因为带入以后存在误差,估计是展开了以后出现了误差。然后用自适应simpson即可。大白书上的模板不怎么好用(虽然能过),优化版的模板如下(本题AC代码):

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<string>
  4. #include<cstring>
  5. #include<map>
  6. #include<set>
  7. #include<queue>
  8. #include<stack>
  9. #include<ctime>
  10. #include<algorithm>
  11. #include<cmath>
  12. #include<vector>
  13. #include<list>
  14. #include<fstream>
  15. #include<sstream>
  16. #include<cassert>
  17. #include<bitset>
  18. #define showtime printf(stderr,"time = %.15f\n",clock() / (double)CLOCKS_PER_SEC)
  19. #pragma comment(linker, "/STACK:1024000000,1024000000")
  20. using namespace std;
  21. typedef long long ll;
  22. typedef long long LL;
  23. typedef unsigned long long ull;
  24. #define MP make_pair
  25. #define PII pair<int,int>
  26. #define PFI pair<double,int>
  27. #define PLL pair<ll,ll>
  28. #define lson l,mid,rt<<1
  29. #define rson mid+1,r,rt<<1|1
  30. //freopen("data.in","r",stdin);
  31. //freopen("data.out","w",stdout);
  32. typedef vector<long long> vec;
  33. typedef vector<vec> mat;
  34. inline int popcnt(int x){return __builtin_popcount(x); }
  35. inline int clz(int x){return __builtin_clz(x);} //末尾的 0,即对 lowbit 取log
  36. inline int clz(LL x){return __builtin_clzll(x);}
  37. inline int lg2(int x){ return !x ? - : -clz(x);}
  38. inline int lg2(LL x){ return !x ? - : -clz(x);}
  39. inline int __lcm(int x, int y){ return x / __gcd(x, y) * y; }
  40. const double eps = 1e-;
  41. const double PI = acos(-.);
  42. const double E = 2.71828182845904523536;
  43. const int MOD = (int)1e9+;
  44. const int INF = 0x3f3f3f3f;
  45. const ll INFLL = 0x3f3f3f3f3f3f3f3f;
  46. const ull BAS = ;
  47. const int M = 1e5 + ;
  48. const int N = 1e5 + ;
  49.  
  50. double v1, v2, x, k;
  51.  
  52. double f(double t){
  53. // 表达式
  54. return k / (((x-v2*t)*(x-v2*t)) + (t*v1) * (t*v1));
  55. }
  56. double simpson(double l,double r){ // simpson公式
  57. return 1.0 / 6.0 * (r - l) * (f(l) + * f((l+r)/2.0) + f(r));
  58. }
  59. double integral(double l,double r){
  60. double mid = (l + r) / 2.0;
  61. double ret = simpson(l,r); // 二分逼近
  62. if(fabs(ret - simpson(l,mid)-simpson(mid,r)) < eps)
  63. return ret;
  64. else
  65. return integral(l,mid) + integral(mid,r);
  66. }
  67. /*
  68. k
  69. ---------------------
  70. (x-v2*t)^2 + (t*v1)^2
  71. */
  72. int main(){
  73. int T;
  74. cin >> T;
  75. while(T --){
  76. cin >> v1 >> v2 >> x >> k;
  77. printf("%.2f\n", integral(, 1e18));
  78. }
  79. return ;
  80. }

1002

  

  1003,用dfs不能过,因为有环,那么谁先更新谁后更新对答案有偏差,因此采用优先队列的dij来做。代码如下:

  1. #include <bits/stdc++.h>
  2. #define t_mid (l+r>>1)
  3. #define ls (o<<1)
  4. #define rs (o<<1|1)
  5. #define lson ls,l,t_mid
  6. #define rson rs,t_mid+1,r
  7. using namespace std;
  8. const int N = 1e5 + ;
  9. typedef long long ll;
  10. typedef pair<int,int> pii;
  11. const int mod = 1e9 + ;
  12.  
  13. int T;
  14. int n, m;
  15. int a[N];
  16. vector<pii> G[N];
  17.  
  18. int main()
  19. {
  20. scanf("%d",&T);
  21. while(T--)
  22. {
  23. scanf("%d%d",&n,&m);
  24. priority_queue<pii,vector<pii>,greater<pii> > Q;
  25. for(int i=;i<=n;i++) {scanf("%d",a+i); Q.push(pii(a[i], i)); G[i].clear();}
  26. for(int i=;i<=m;i++)
  27. {
  28. int x, y, z;
  29. scanf("%d%d%d",&x,&y,&z);
  30. G[x].push_back(pii(y,z));
  31. G[y].push_back(pii(x,z));
  32. }
  33. while(!Q.empty())
  34. {
  35. pii p = Q.top(); Q.pop();
  36. int u1 = p.second;
  37. for(pii pp : G[u1])
  38. {
  39. int u2 = pp.first;
  40. int v = pp.second;
  41. if(a[v] > a[u1] + a[u2])
  42. {
  43. a[v] = a[u1] + a[u2];
  44. Q.push(pii(a[v], v));
  45. }
  46. }
  47. }
  48. for(int i=;i<=n;i++) printf("%d%c",a[i],i==n?'\n':' ');
  49. }
  50. return ;
  51. }

1003

  1004,水题。

  1005,3!枚举一下3种字符的排列顺序,得到此时的目标串,然后和原串匹配一下得到在目标串中的连续的最长的子串,这个长度就是不需要动的牌,然后所有情况比较得到最优解即可。需要是连续的是因为每次只能把牌放到最前和最后,不难证明可以成立。同时这个匹配的方法可以dp,也可以暴力。这个dp的转移还是需要注意一下的。代码如下:

  1. #include <bits/stdc++.h>
  2. #define t_mid (l+r>>1)
  3. #define ls (o<<1)
  4. #define rs (o<<1|1)
  5. #define lson ls,l,t_mid
  6. #define rson rs,t_mid+1,r
  7. using namespace std;
  8. const int N = 1e5 + ;
  9. typedef long long ll;
  10. typedef pair<int,int> pii;
  11. const int mod = 1e9 + ;
  12.  
  13. int T;
  14. char s[];
  15. char t[];
  16. int cnt[];
  17. char need[][];
  18. char str[];
  19. int ans;
  20.  
  21. int dp[][];
  22. void solve()
  23. {
  24. // s -> str
  25. //printf("%s -- %s\n",s+1,str+1);
  26. for(int l=;l<=;l++)
  27. {
  28. for(int r=l+;r<=;r++)
  29. {
  30. int temp = ;
  31. for(int i=;i<=;i++)
  32. {
  33. if(s[i] == str[l+temp])
  34. {
  35. temp++;
  36. }
  37. }
  38. if(temp == r - l + ) ans = max(ans, r - l + );
  39. }
  40. }
  41. /*memset(dp,0,sizeof dp);
  42. for(int i=1;i<=13;i++)
  43. {
  44. for(int j=1;j<=13;j++)
  45. {
  46. if(s[i] == str[j])
  47. {
  48. dp[i][j] = dp[i-1][j-1] + 1;
  49. }
  50. else dp[i][j] = dp[i-1][j];
  51. ans = max(ans, dp[i][j]);
  52. }
  53. }*/
  54. }
  55.  
  56. int main()
  57. {
  58. // 3 1 2
  59. //printf("%d %d %d ?\n",'a','1','A');
  60. scanf("%d",&T);
  61. while(T--)
  62. {
  63. scanf("%s",s+);
  64. memcpy(t,s,sizeof t);
  65. sort(t+,t++);
  66. memset(cnt,,sizeof cnt);
  67. memset(need,,sizeof need);
  68. int now = ;
  69. int p = ;
  70. for(;;now++)
  71. {
  72. if(!isdigit(t[now])) break;
  73. need[][++p] = t[now];
  74. }
  75. cnt[] = now - ;
  76. p = ;
  77. for(;;now++)
  78. {
  79. if(t[now] < 'A' || t[now] > 'Z') break;
  80. need[][++p] = t[now];
  81. }
  82. cnt[] = p;
  83. p = ;
  84. for(;now<=;now++)
  85. {
  86. need[][++p] = t[now];
  87. }
  88. cnt[] = p;
  89.  
  90. ans = ;
  91. memset(str,,sizeof str);
  92. strcat(str+,need[]+); strcat(str+,need[]+); strcat(str+,need[]+);
  93. solve();
  94. memset(str,,sizeof str);
  95. strcat(str+,need[]+); strcat(str+,need[]+); strcat(str+,need[]+);
  96. solve();
  97. memset(str,,sizeof str);
  98. strcat(str+,need[]+); strcat(str+,need[]+); strcat(str+,need[]+);
  99. solve();
  100. memset(str,,sizeof str);
  101. strcat(str+,need[]+); strcat(str+,need[]+); strcat(str+,need[]+);
  102. solve();
  103. memset(str,,sizeof str);
  104. strcat(str+,need[]+); strcat(str+,need[]+); strcat(str+,need[]+);
  105. solve();
  106. memset(str,,sizeof str);
  107. strcat(str+,need[]+); strcat(str+,need[]+); strcat(str+,need[]+);
  108. solve();
  109. printf("%d\n",-ans);
  110. }
  111. return ;
  112. }

1005

  1006,做这题前可以先做一下hdu2045。在该题中两个颜色相同的位置(称之为分隔处)把这个串分成了两部分,这两个相同颜色的位置假设颜色已经固定了(最后只要把答案再乘以k即可),那么剩余的有(k-1)种颜色可选择,设f[i]为长度为i的合理串的种数,那么这个状态可以从以下两个状态转移过来:

  1.长度为i-1的合理的串,那么其最后一个颜色一定与分隔处不同,那么第i个位置只剩下了(k-2)种选择,贡献为(k-2)*f[i-1]。

  2.长度为i-1的不合理的串,那么前i-2个必须合理,否则不能转移到i处,同时不可能是i-2和i-1处的颜色不同(如果不同也无法转移到i处),只能是i-1处和分隔处的颜色相同才行,那么i这个地方有(k-1)种选择,贡献为(k-1)*f[i-2]。

  综上可得,f[i] = f[i-1]*(k-2) + f[i-2]*(k-1)(可以发现这种推算f的方式和hdu2045中类似)。边界处手算一下即可。得到了以后就可以做了。假设分隔位置为l和r,那么新的两部分的长度为别为Len1=|r-l|-1,Len2=n-|r-l|-1。那么最后的答案为k*f[Len1]*f[Len2] % mod。

  同时,还有别的方法推f数组,每次扩张一个新长度时,只有k-1种选择(因为不能和分隔处颜色相同),所以总次数为(k-1)^i,这其中有重复的,计算方法如下:如果i-1处和分隔处颜色相同,那么i这个位置一定不会和相邻位置颜色相同;当i-1处和分隔处颜色不同,这时才有可能i的颜色和i-1处的重合,这种情况的总数是,前i-1个位置的正确总数,即f[i-1],那么f[i] = (k-1)^i - f[i-1]。后面的计算方法类似。

  代码如下(第一种推算f数组的方法):

  1. #include <bits/stdc++.h>
  2. #define t_mid (l+r>>1)
  3. #define ls (o<<1)
  4. #define rs (o<<1|1)
  5. #define lson ls,l,t_mid
  6. #define rson rs,t_mid+1,r
  7. using namespace std;
  8. const int N = 1e5 + ;
  9. typedef long long ll;
  10. typedef pair<int,int> pii;
  11. const int mod = 1e9 + ;
  12.  
  13. int n,m,k;
  14. int f[N];
  15.  
  16. int main()
  17. {
  18. while(scanf("%d%d%d",&n,&m,&k) == )
  19. {
  20. f[] = k-;
  21. f[] = (ll)(k-) * (k-) % mod;
  22. for(int i=;i<=n;i++)
  23. {
  24. f[i] = ((ll)(k-)*f[i-] + (ll)(k-)*f[i-]) % mod;
  25. }
  26. while(m--)
  27. {
  28. int l, r;
  29. scanf("%d%d",&l,&r);
  30. int ans = (ll)k*f[abs(r-l)-] % mod * (f[n-abs(r-l)-]) % mod;
  31. printf("%d\n",ans);
  32. }
  33. }
  34. return ;
  35. }

1006

  1007,分奇数和偶数作为起点进行扫描,维护遇到的最小的前缀和并更新答案即可。

  1008,结论题。如果两点是相邻的则能追到,否则不行。理由是如果距离大于等于2,走的人走哪里,打断下一条路即可。

  1009,分情况讨论即可。注意即使一开始全部相同,也必须要交换(也就是说要满足,只能换相同的两个字母)。

  1010,因为位数少,直接暴力即可。如果位数多,可以考虑数位dp。

2017杭电ACM集训队单人排位赛 - 2 题解的更多相关文章

  1. 2017杭电ACM集训队单人排位赛 - 6

    2017杭电ACM集训队单人排位赛 - 6 排名 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 59 1 X X 1 1 X X 0 1 ...

  2. 高手看了,感觉惨不忍睹——关于“【ACM】杭电ACM题一直WA求高手看看代码”

    按 被中科大软件学院二年级研究生 HCOONa 骂为“误人子弟”之后(见:<中科大的那位,敢更不要脸点么?> ),继续“误人子弟”. 问题: 题目:(感谢 王爱学志 网友对题目给出的翻译) ...

  3. 杭电ACM题单

    杭电acm题目分类版本1 1002 简单的大数 1003 DP经典问题,最大连续子段和 1004 简单题 1005 找规律(循环点) 1006 感觉有点BT的题,我到现在还没过 1007 经典问题,最 ...

  4. 杭电acm习题分类

    专注于C语言编程 C Programming Practice Problems (Programming Challenges) 杭电ACM题目分类 基础题:1000.1001.1004.1005. ...

  5. 杭电ACM分类

    杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...

  6. 杭电ACM(1002) -- A + B Problem II 大数相加 -提交通过

    杭电ACM(1002)大数相加 A + B Problem II Problem DescriptionI have a very simple problem for you. Given two ...

  7. 杭电acm阶段之理工大版

    想參加全国软件设计大赛C/C++语言组的同学,假设前一篇<C和指针课后练习题总结>没看完的,请先看完而且依照上面的训练做完,然后做以下的训练. 传送门:http://blog.csdn.n ...

  8. 杭电acm 1076题

    水题,一个求闰年的题目,复习一下闰年的求法.... 1,如果能被4整除但不能被100整除的是闰年 2,能被400整除的是闰年 题目大意是:给定一个开始年份T以及一个正数N,要求求出从T开始,到了哪一年 ...

  9. 杭电acm 1037题

    本题应该是迄今为止最为简单的一道题,只有一组输入,输出也简单.... /****************************************** 杭电acm 1037题 已AC ***** ...

随机推荐

  1. C# SpinLock用法。

    class Program { static void Main(string[] args) { ; ]; Stopwatch sp = new Stopwatch(); sp.Start(); / ...

  2. ubuntu环境下pycharm编译程序import包出错:ImportError: dynamic module does not define init function (init_caffe)

    出错原因是因为pycharm中的python版本不对,比如程序为2.7版本,但是pycharm编解释器为python3,导致出错,去setting改一下版本就行:pycharm>file> ...

  3. Go part 7 反射,反射类型对象,反射值对象

    反射 反射是指在程序运行期间对程序本身进行访问和修改的能力,(程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分,在运行程序时,程序无法获取自身的信息) 支持反射的语言可以在程序编 ...

  4. 《你不知道的Javascript》感悟篇—对象属性遍历的那些事

    划重点 本篇笔者将重点介绍JavaScript中 getOwnPropertyNames .Object.keys.for ... in 的使用及他们之间的异同点. getOwnPropertyNam ...

  5. Java 之 Junit 单元测试

    Junit 单元测试 测试分类: 1.黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值. 2.白盒测试:需要写代码.关注程序具体的执行流程. Junit 测试:(属于白盒测试) 步骤: 1 ...

  6. win10 下的 CUDA10.0 +CUDNN + tensorflow + opencv 环境部署

    1 CUDA 10.0 安装  win10 下的cuda 安装是非常简单的,和其他程序安装没什么区别,现在 tensorflow 1.13 版本以上 支持 CUDA 10.0 ,这里选取了CUDA 1 ...

  7. 【OF框架】框架规范介绍

    一.目录规范 二.命名规范 三.其它规范

  8. java技术哪些是必学的?

    福州seo推广我们接触过java需要的小伙伴们都知道java是一门强大而又复杂的编程语言,现如今在互联网行业,java的身影随处可见,可能刚学习的小伙伴们会被java语言庞大的体系图吓到,不过知识毕竟 ...

  9. QCheckBox 使用本地图片的QSS样式

    setStyleSheet 为以下字符串,选中,未选中,有焦点,无焦点时显示不一样的图片 QString("QCheckBox::indicator:unchecked{image:url( ...

  10. Spring Data JPA 提供的各种Repository接口作用

    各种Repository接口继承关系: Repository : public interface UserRepository extends Repository<User, Integer ...