题目链接:Uva传送门 CFGym传送门

UVALive7897 Number Theory Problem (找规律签到)

思路:

  8的幂次都是可以的,因为an-1一定能分解成a-1乘上一个多项式。

  看不出来也没关系,打表就发现每三个数有一个7的倍数。

代码:

  1. #include <cstdio>
  2.  
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7. int T, kase = ;
  8. scanf("%d", &T);
  9. while (T--) {
  10. int N;
  11. scanf("%d", &N);
  12. printf("Case #%d: %d\n", kase++, N/);
  13. }
  14.  
  15. return ;
  16. }

UVALive7899 Mr. Panda and Strips (暴搜+尺取+剪枝)

思路:

  我也不知道这是什么做法,神棍剪枝吧-。=

  尺取大法好(超大声)

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int MAX_N = 1e3 + ;
  5. const int MAX_C = 1e5 + ;
  6.  
  7. int N;
  8. int C[MAX_N], len[MAX_N];
  9. int ans;
  10. bool vis[MAX_C];
  11.  
  12. inline void reset() {
  13. for (int i = ; i <= N; i++) vis[C[i]] = false;
  14. }
  15.  
  16. void init()
  17. {
  18. cin >> N;
  19. for (int i = ; i <= N; i++)
  20. scanf("%d", C+i);
  21. C[N+] = ;
  22. reset();
  23. }
  24.  
  25. inline int jump(int pos, int limit) {
  26. int l = pos, r = pos, res = -;
  27. while (r <= N) {
  28. while (!vis[C[r]] && r <= N) vis[C[r++]] = true;
  29. if (len[l] < limit) break;
  30. res = max(res, r-l);
  31. while ( vis[C[r]] && l <= r) vis[C[l++]] = false;
  32. }
  33. for (int i = l; i < r; i++) vis[C[i]] = false;
  34. return res;
  35. }
  36.  
  37. int main()
  38. {
  39. int T, kase = ;
  40. cin >> T;
  41. while (T--) {
  42. init();
  43. for (int i = ; i <= N; i++, reset()) {
  44. len[i] = ;
  45. for (int j = i; j <= N && !vis[C[j]]; j++)
  46. len[i]++, vis[C[j]] = true;
  47. }
  48. len[N+] = ;
  49. for (int i = N; i >= ; i--)
  50. len[i] = max(len[i], len[i+]);
  51. ans = len[];
  52.  
  53. for (int i = ; i <= N; i++, reset())
  54. for (int j = i; j <= N && !vis[C[j]]; j++) {
  55. vis[C[j]] = true;
  56. if (ans >= j-i+ + len[j]) continue;
  57. int res = jump(j+, ans-(j-i+));
  58. ans = max(ans, j-i+ + res);
  59. }
  60. reset();
  61. printf("Case #%d: %d\n", kase++, ans);
  62. }
  63. return ;
  64. }
  65. /*
  66. 3
  67. 8
  68. 3 1 2 1 6 1 2 5
  69. 3
  70. 1 2 3
  71. 3
  72. 1 1 1
  73. */

UVALive7900 Ice Cream Tower (二分+贪心)

假思路:

  贪心地取冰淇淋球,尽可能地早点做出Tower,不能放在之前的冰淇淋上的球当作新的底座。

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5. const int MAX_N = 3e5 + ;
  6.  
  7. struct QNode{
  8. ll val;
  9. int len;
  10. QNode(ll v = , int l = ) : val(v), len(l) {}
  11. };
  12.  
  13. ll B[MAX_N];
  14. queue <QNode> Q;
  15.  
  16. int main()
  17. {
  18. int T, kase = ;
  19. cin >> T;
  20. while (T--) {
  21. int N, K, ans = ;
  22. cin >> N >> K;
  23. for (int i = ; i <= N; i++)
  24. scanf("%lld", B+i);
  25. sort(B+, B++N);
  26. for (int i = N; i >= ; i--) {
  27. if (Q.empty()) {
  28. Q.push(QNode(B[i], ));
  29. continue;
  30. }
  31. QNode cur = Q.front();
  32. if (cur.val/ >= B[i]) {
  33. Q.pop();
  34. if (cur.len+ == K)
  35. ans++;
  36. else
  37. Q.push(QNode(B[i], cur.len+));
  38. }
  39. else {
  40. Q.push(QNode(B[i], ));
  41. }
  42. }
  43. while (!Q.empty())
  44. Q.pop();
  45. printf("Case #%d: %d\n", kase++, ans);
  46. }
  47. return ;
  48. }
  49. /*
  50. 3
  51. 4 2
  52. 1 2 3 4
  53. 6 3
  54. 1 1 2 2 4 4
  55. 6 3
  56. 1 1 2 2 3 4
  57. */

  自我hack【精通】。。codeforces gym上的数据比较强,上面的代码就不能过了。

  1.  

思路:

  二分答案,用上面的贪心法验证。。。。O(Nlog(N/K))

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5. const int MAX_N = 3e5 + ;
  6. struct Node{
  7. ll val, len;
  8. Node(ll v = , ll l = ) : val(v), len(l) {}
  9. };
  10.  
  11. int N, K;
  12. ll B[MAX_N];
  13.  
  14. queue <Node> Q;
  15. bool solve(int ans){
  16. while (!Q.empty())
  17. Q.pop();
  18. if (K == )
  19. return true;
  20. for (int i = ; i <= ans; i++)
  21. Q.push(Node(B[i], ));
  22. for (int i = ans+; i <= N; i++) {
  23. if (Q.empty())
  24. break;
  25. Node cur = Q.front();
  26. if (B[i]/ >= cur.val) {
  27. Q.pop();
  28. if (cur.len == K-)
  29. continue;
  30. Q.push(Node(B[i], cur.len+));
  31. }
  32. }
  33. return Q.empty();
  34. }
  35.  
  36. int main()
  37. {
  38. int T;
  39. cin >> T;
  40. for (int kase = ; kase <= T; kase++) {
  41. cin >> N >> K;
  42. for (int i = ; i <= N; i++)
  43. scanf("%lld", B+i);
  44. sort(B+, B++N);
  45. int ansl = , ansr = N, ans = ;
  46. while (ansl <= ansr) {
  47. int mid = (ansl + ansr) >> ;
  48. if (solve(mid)) {
  49. ans = max(ans, mid);
  50. ansl = mid+;
  51. }
  52. else {
  53. ansr = mid-;
  54. }
  55. }
  56. printf("Case #%d: %d\n", kase, ans);
  57. }
  58. return ;
  59. }
  60. /*
  61. 3
  62. 4 2
  63. 1 2 3 4
  64. 6 3
  65. 1 1 2 2 4 4
  66. 6 3
  67. 1 1 2 2 3 4
  68. */

UVALive7901 Bet (数学+贪心+高精度除法(long double))

思路:

  小学数学题-。=

  贪心地选性价比高的队伍,能选多个队伍的条件是这些队伍的A/(A+B)的和小于1。。。。这个精度啊。。比赛的时候WA来WA去就是没想到,Dilthey瞄了一眼题解发现是高精度除法,long double够用。。。换上long double就AC了。。在现场的话,不知道这个高精度估计要悔恨终身了。

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int MAX_N = + ;
  5. const long double money = 1e3 + ;
  6. const long double eps = 1e-;
  7.  
  8. long double A[MAX_N], B[MAX_N], C[MAX_N];
  9.  
  10. int main()
  11. {
  12. int T;
  13. cin >> T;
  14. for (int kase = ; kase <= T; kase++) {
  15. int N;
  16. cin >> N;
  17. for (int i = ; i <= N; i++) {
  18. char x;
  19. cin >> A[i] >> x >> B[i];
  20. C[i] = (long double)A[i] / (A[i] + B[i]);
  21. }
  22. sort(C+, C++N);
  23. int cnt = ;
  24. long double sum = ;
  25. while (cnt+ <= N && sum + C[cnt+]*money < money-eps) {
  26. sum += C[++cnt]*money;
  27. }
  28. printf("Case #%d: %d\n", kase, cnt);
  29. }
  30. return ;
  31. }
  32. /*
  33. 3
  34. 2
  35. 5:3
  36. 2:7
  37. 2
  38. 1:1
  39. 1:1.01
  40. 3
  41. 1:1.1
  42. 1:0.2
  43. 1.5:1.7
  44. */
  45. /*
  46. 10
  47. 12
  48. 1:10
  49. 1:10
  50. 1:10
  51. 1:10
  52. 1:10
  53. 1:10
  54. 1:10
  55. 1:10
  56. 1:10
  57. 1:10
  58. 1:10
  59. 1:10
  60. 12
  61. 1:9.9
  62. 1:9.9
  63. 1:9.9
  64. 1:9.9
  65. 1:9.9
  66. 1:9.9
  67. 1:9.9
  68. 1:9.9
  69. 1:9.9
  70. 1:9.9
  71. 1:9.9
  72. 1:9.9
  73. 12
  74. 1:10.1
  75. 1:10.1
  76. 1:10.1
  77. 1:10.1
  78. 1:10.1
  79. 1:10.1
  80. 1:10.1
  81. 1:10.1
  82. 1:10.1
  83. 1:10.1
  84. 1:10.1
  85. 1:10.1
  86. */

UVALive7908 Great Cells (数学思维+快速幂)

思路:Dilthey的博客

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5. const ll MOD = ;
  6.  
  7. ll fpow(ll a, ll p) {
  8. ll ans = ;
  9. while (p) {
  10. if (p&) ans *= a, ans %= MOD;
  11. a *= a, a %= MOD;
  12. p >>= ;
  13. }
  14. return ans;
  15. }
  16.  
  17. int main()
  18. {
  19. int T;
  20. cin >> T;
  21. for (int kase = ; kase <= T; kase++) {
  22. ll N, M, K;
  23. cin >> N >> M >> K;
  24. ll ans = ;
  25. for (ll i = ; i <= K; i++)
  26. ans += fpow(i-, N-+M-), ans %= MOD;
  27. ans *= N*M, ans %= MOD;
  28. ans *= fpow(K, (N-)*(M-)), ans %= MOD;
  29. ans += fpow(K, N*M), ans %= MOD;
  30. printf("Case #%d: ", kase);
  31. cout << ans << endl;
  32. }
  33. return ;
  34. }
  35. /*
  36. 3
  37. 2 2 2
  38. 2 3 2
  39. 3 4 5
  40. */

UVALive7908 World Cup (3进制状压+枚举)

思路:

  把所有的可能答案都预处理出来,有36个,直接枚举时间复杂度为O(4*36T)。

  预处理的时候把比赛结果的可能性:胜负,平局,负胜压成六位三进制数即可。

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int l[] = {, , , , , };
  5. const int r[] = {, , , , , };
  6. const int len = ;
  7.  
  8. int pow(int a, int p)
  9. {
  10. int ans = ;
  11. while (p) {
  12. if (p&) ans *= a;
  13. a *= a;
  14. p >>= ;
  15. }
  16. return ans;
  17. }
  18.  
  19. int A[];
  20. int res[len+][];
  21.  
  22. void init()
  23. {
  24. memset(res, , sizeof res);
  25. for (int i = ; i < len; i++) {
  26. int tmp = i;// mod 3 = 0胜,1平,2败。
  27. for (int j = ; j < ; j++) {
  28. if (tmp % == ) {
  29. res[i][l[j]] += ;
  30. }
  31. else if (tmp % == ) {
  32. res[i][l[j]]++;
  33. res[i][r[j]]++;
  34. }
  35. else if (tmp % == ) {
  36. res[i][r[j]] += ;
  37. }
  38. tmp /= ;
  39. }
  40. }
  41. }
  42.  
  43. int main()
  44. {
  45. init();
  46. int T;
  47. cin >> T;
  48. for (int kase = ; kase <= T; kase++) {
  49. for (int i = ; i <= ; i++)
  50. scanf("%d", A+i);
  51. int valid = ;
  52. for (int i = ; i < len; i++) {
  53. int j;
  54. for (j = ; j <= ; j++)
  55. if (A[j] != res[i][j])
  56. break;
  57. if (j == ) {
  58. valid++;
  59. }
  60. }
  61. printf("Case #%d: ", kase);
  62. if (!valid)
  63. puts("Wrong Scoreboard");
  64. else {
  65. sort(A, A+);
  66. if (valid > )
  67. puts("No");
  68. else
  69. puts("Yes");
  70. }
  71. }
  72. return ;
  73. }
  74. /*
  75. 3
  76. 9 6 3 0
  77. 6 6 6 0
  78. 10 6 3 0
  79. */

2016 ACM-ICPC EC-Final的更多相关文章

  1. 2016 ACM/ICPC Asia Regional Shenyang Online 1009/HDU 5900 区间dp

    QSC and Master Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  2. 2016 ACM/ICPC Asia Regional Shenyang Online 1003/HDU 5894 数学/组合数/逆元

    hannnnah_j’s Biological Test Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K ...

  3. 2016 ACM/ICPC Asia Regional Qingdao Online 1001/HDU5878 打表二分

    I Count Two Three Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  4. 2016 ACM/ICPC Asia Regional Shenyang Online 1007/HDU 5898 数位dp

    odd-even number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  5. 2016 ACM/ICPC Asia Regional Dalian Online 1002/HDU 5869

    Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

  6. 2016 ACM/ICPC Asia Regional Dalian Online 1006 /HDU 5873

    Football Games Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  7. HDU 5874 Friends and Enemies 【构造】 (2016 ACM/ICPC Asia Regional Dalian Online)

    Friends and Enemies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  8. HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  9. HDU 5875 Function 【倍增】 (2016 ACM/ICPC Asia Regional Dalian Online)

    Function Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  10. HDU 5873 Football Games 【模拟】 (2016 ACM/ICPC Asia Regional Dalian Online)

    Football Games Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

随机推荐

  1. 微信小程序生成二维码

    微信小程序客户端生成二维码的方法, 请参考这里: https://github.com/demi520/wxapp-qrcode  代码片段如下: const QR = require(". ...

  2. js 数组api

    Javascript Array API   JS数组对象提供了很多API方法,要用到的朋友可以查阅哈,如有错误欢迎指正. /** * Created by Administrator on 2017 ...

  3. learning scala 数组和容器

    数组:可变的,可索引的,元素具有相同类型的数据集合 一维数组 scala> val intValueArr = new Array[Int](3)intValueArr: Array[Int] ...

  4. frameset的固定放置模式,不能放入<form runat="server">中

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="admin_default.as ...

  5. linux图形和命令界面切换

    一.系统不在虚拟机中的情况 使用ctrl+alt+F1~6切换到命令行界面:ctrl+alt+F7切换到图形界面 二.系统在虚拟机中的情况 Ctrl+Alt+shift+F1~6切换到命令行界面:使用 ...

  6. nginx配置文件详解(三)

    nginx配置文件详细解析 nginx安装目录:  /usr/local/nginx 配置文件:  /usr/local/nginx/conf 目录下的 nginx.conf文件 nginx优化方法1 ...

  7. update-alternatives关键解疑

    update-alternatives的用法网上到处又有,但有2个知识点好像都没怎么提到: 1.--install 里的参数link到底是啥意思,其实update-alternatives本质就是在/ ...

  8. ubuntu gnome桌面隐藏顶栏

    注意:ubuntu 14.04.5默认的为unity桌面,有多点触发,没有自带Tweak Tool工具.需安装gnome 桌面,可参见我的另一随笔. 环境: ubuntu 14.04.5 gnome ...

  9. 谷歌开源的TensorFlow Object Detection API视频物体识别系统实现(二)[超详细教程] ubuntu16.04版本

    本节对应谷歌开源Tensorflow Object Detection API物体识别系统 Quick Start步骤(一): Quick Start: Jupyter notebook for of ...

  10. 关于对Access数据库的学习报告

    学习Access数据库的报告 一.前言 一开始我对access一窍不通,甚至不知道它是干什么的,后来经过网上资料的查阅对它略有了解.microsoft office access是由微软发布的关联式数 ...