A.直接暴力就行了,先把能组合的按线性组合掉,再枚举剩下相邻没用过的。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. string s;
  5. int vis[] = {};
  6.  
  7. int main()
  8. {
  9. ios::sync_with_stdio(false);
  10. cin >> s;
  11. int ans = ;
  12. for(int i = ;i < s.length();i++)
  13. {
  14. if(vis[i-] || vis[i]) continue;
  15. if(s[i-] == 'V' && s[i] == 'K')
  16. {
  17. ans++;
  18. vis[i-] = ;
  19. vis[i] = ;
  20. }
  21. }
  22. for(int i = ;i < s.length();i++)
  23. {
  24. if(vis[i-] || vis[i]) continue;
  25. if(s[i-] == 'V' || s[i] == 'K')
  26. {
  27. ans++;
  28. break;
  29. }
  30. }
  31. cout << ans << endl;
  32. return ;
  33. }

B.若存在,直接令y等于z就可以了。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. string s1,s2;
  5.  
  6. int main()
  7. {
  8. ios::sync_with_stdio(false);
  9. cin >> s1 >> s2;
  10. string s3;
  11. int flag = ;
  12. for(int
  13. i = ;i < s1.length();i++)
  14. {
  15. if(s2[i] <= s1[i]) s3 = s3+s2[i];
  16. else
  17. {
  18. flag = ;
  19. }
  20. }
  21. if(flag) cout << -<< endl;
  22. else cout << s3 << endl;
  23.  
  24. return ;
  25. }

C.二分,先判断是否能永久运行,若不行,二分答案。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int n,p,a[],b[];
  5.  
  6. bool ok(double x)
  7. {
  8. double sum = ;
  9. for(int i = ;i <= n;i++)
  10. {
  11. if(a[i]*x > b[i]) sum += a[i]*x-b[i];
  12. }
  13. if(sum < p*x) return ;
  14. return ;
  15. }
  16. int main()
  17. {
  18. ios::sync_with_stdio(false);
  19. cin >> n >> p;
  20. long long sum = ;
  21. for(int i = ;i <= n;i++)
  22. {
  23. cin >> a[i] >> b[i];
  24. sum += a[i];
  25. }
  26. if(sum <= p)
  27. {
  28. cout << - << endl;
  29. return ;
  30. }
  31. double l = ,r = 1e18;
  32. while(abs(l-r) > 1e-)
  33. {
  34. double mid = (l+r)/;
  35. if(ok(mid)) l = mid;
  36. else r = mid;
  37. }
  38. cout << l << endl;
  39. return ;
  40. }

D.枚举每一组相邻3个顶点,取中间点到两边点构成直线的距离的最小值,再除以2。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int n;
  5. double a[],b[];
  6.  
  7. double f(double x1,double y1,double x2,double y2,double x3,double y3)
  8. {
  9. double aa = y2-y1,bb = x1-x2,cc = x2*y1-x1*y2;
  10. return abs(aa*x3+bb*y3+cc)/sqrt(aa*aa+bb*bb);
  11. }
  12. int main()
  13. {
  14. ios::sync_with_stdio(false);
  15. cin >> n;
  16. for(int i = ;i <= n;i++) cin >> a[i] >> b[i];
  17. double ans = 1e18;
  18. for(int i = ;i <= n;i++)
  19. {
  20. int j = i+,k = j+;
  21. if(j > n) j -= n;
  22. if(k > n) k -= n;
  23. ans = min(ans,f(a[i],b[i],a[j],b[j],a[k],b[k]));
  24. ans = min(ans,f(a[i],b[i],a[k],b[k],a[j],b[j]));
  25. ans = min(ans,f(a[j],b[j],a[k],b[k],a[i],b[i]));
  26. }
  27. cout << fixed << setprecision() << ans/ << endl;
  28. return ;
  29. }

E.令p[i]为第i次出现的前i个元素积(%m),问题是如何构造最长的p序列。

设元素i,j,则①i可以向j转移的条件是gcd(m, i)丨gcd(m, j)

      ②i,j可以互相转移的条件是gcd(m, i)=gcd(m, j)

于是,我们把每一个gcd看成点,同一个gcd间的元素可以相互转化,然后构成图,dfs找最长路线。

有了p序列,pi-1*x%p==pi(P0=1),求解每一个x输出即可,这个可以用扩展欧几里德解决。

0这个点可以放到最后特殊处理。

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. using namespace std;
  4.  
  5. int n,m,cantbe[] = {},vis[] = {},dp[],nextt[];
  6. vector<int> v[];
  7.  
  8. LL ex_gcd(LL a,LL b,LL &x,LL &y)
  9. {
  10. int d = a;
  11. if(!b)
  12. {
  13. x = ;
  14. y = ;
  15. }
  16. else
  17. {
  18. d = ex_gcd(b,a%b,y,x);
  19. y -= (a/b)*x;
  20. }
  21. return d;
  22. }
  23.  
  24. LL f(LL a,LL b,LL n)
  25. {
  26. LL d,x,y;
  27. d = ex_gcd(a,n,x,y);
  28. x = (x%n+n)%n;
  29. return (x*b/d)%n;
  30. }
  31.  
  32. int dfs(int now)
  33. {
  34. if(dp[now] > ) return dp[now];
  35. dp[now] = v[now].size();
  36. for(int i = now*;i < m;i += now)
  37. {
  38. if(v[i].size() == ) continue;
  39. int t = dfs(i);
  40. if(dp[now] < v[now].size()+t)
  41. {
  42. dp[now] = t+v[now].size();
  43. nextt[now] = i;
  44. }
  45. }
  46. return dp[now];
  47. }
  48.  
  49. int main()
  50. {
  51. ios::sync_with_stdio(false);
  52. cin >> n >> m;
  53. for(int i = ;i <= n;i++)
  54. {
  55. int x;
  56. cin >> x;
  57. cantbe[x] = ;
  58. }
  59. for(int i = ;i < m;i++)
  60. {
  61. if(!cantbe[i]) v[__gcd(i,m)].push_back(i);
  62. }
  63. memset(dp,,sizeof(dp));
  64. memset(nextt,-,sizeof(nextt));
  65. dfs();
  66. int now = max_element(dp,dp+m)-dp;
  67. cout << dp[now]+(cantbe[] == ) << endl;
  68. int last = ;
  69. while(now != -)
  70. {
  71. for(int i = ;i < v[now].size();i++)
  72. {
  73. int t = v[now][i];
  74. cout << f(last,t,m) << " ";
  75. last = t;
  76. }
  77. now = nextt[now];
  78. }
  79. if(cantbe[] == ) cout << << endl;
  80. else cout << endl;
  81. return ;
  82. }

Codeforces_801的更多相关文章

随机推荐

  1. 1046 划拳 (15 分)C语言

    划拳是古老中国酒文化的一个有趣的组成部分.酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字.如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒.两人同赢或两人同输 ...

  2. 机器学习实战笔记(一)- 使用SciKit-Learn做回归分析

    一.简介 这次学习的书籍主要是Hands-on Machine Learning with Scikit-Learn and TensorFlow(豆瓣:https://book.douban.com ...

  3. day2(使用list和tuple)

    list list是一种有序的集合 >>>aaa = ['abc','bob','tracy'] >>>aaa ['abc','bob','tracy'] len( ...

  4. 2019 年百度之星 初赛一 1002 Game

    传送门 Problem Description 度度熊在玩一个好玩的游戏.游戏的主人公站在一根数轴上,他可以在数轴上任意移动,对于每次移动,他可以选择往左或往右走一格或两格.现在他要依次完成 n 个任 ...

  5. MATLAB生成正弦波

    要求:选定采样频率,生成不同频率的正弦波 程序: f1=100;%生成正弦波的频率 fs=1000;%采样频率 N=100;%采样点数 n=0:N-1; t=n/fs;%时间序列 y=sin(2*pi ...

  6. GXOI&GZOI

    T1 与或和   2s&&512MB   简明题意:求一个矩阵的所有子序列的 \(and\)和 和\(or\)和: 子矩阵的\(and\)和就是所有值\(and\)起来:\(or\)类 ...

  7. MySQL 基础 SQL 操作

    MySQL 用户 --登录 mysql -u<用户名> -p[密码] --修改密码 mysqladmin -u<用户名> -p[密码] password <new_pas ...

  8. 阿里CTR预估:用户行为长序列建模

    本文将介绍Alibaba发表在KDD'19 的论文<Practice on Long Sequential User Behavior Modeling for Click-Through Ra ...

  9. 本地缓存google.guava及分布式缓存redis 随笔

    近期项目用到了缓存,我选用的是主流的google.guava作本地缓存,redis作分布式 缓存,先说说我对本地缓存和分布式缓存的理解吧,可能不太成熟的地方,大家指出,一起 学习.本地缓存的特点是速度 ...

  10. Java入门 - 语言基础 - 22.异常处理

    原文地址:http://www.work100.net/training/java-exception.html 更多教程:光束云 - 免费课程 异常处理 序号 文内章节 视频 1 概述 2 Exce ...