Problem A. Kicksort

题意抽象一下为:

  对于一个每次都从数列正中间取划分数的快速排序,给定一个1-n的排列,问快排的复杂度对于这个排列是否会退化为最坏复杂度。

  数据范围:  测试组数1 ≤ T ≤ 100.   2 ≤ N ≤ 10000. 

  

  思路:

  如连连看一般在一列数中反复消去正中间一个,判断其是否一直是目前数列的最小元素或最大元素。

  模拟即可,维护一个当前数列最小值,当前数列最大值,消去边界l和r。(注意到每次消去的元素在原数列中必然组成一个连续区间)

  每次判断消去边界应该左移还是右移,消去数是否为当前数列最小值或最大值,是则更新最小值或最大值,否则输出NO。

  AC代码:

  

  1. #include<bits/stdc++.h>
  2. #define rep(i,a,b) for(int i=a;i<=b;i++)
  3. using namespace std;
  4. const int MAXN=;
  5. int a[MAXN];
  6. int main()
  7. {
  8. // freopen("in.txt","r",stdin);
  9. freopen("A-large (1).in","r",stdin);
  10. freopen("A-large (1).out","w",stdout);
  11. int T,n,tempmax,tempmin,l,r,mid;
  12. scanf("%d",&T);
  13. rep(t1,,T)
  14. {
  15. scanf("%d",&n);
  16. for(int i=;i<n;++i) scanf("%d",&a[i]);
  17. tempmax=n;
  18. tempmin=;
  19. int flag=;
  20. l=(n-)/;r=l+;
  21. rep(i,,n-)
  22. {
  23. mid=(l+n-r)/;
  24. if(mid<=l)
  25. {
  26. mid=l;
  27. l--;
  28. }
  29. else
  30. {
  31. mid=r;
  32. r++;
  33. }
  34. if(a[mid]==tempmax)
  35. {
  36. tempmax-=;
  37. }
  38. else if(a[mid]==tempmin)
  39. {
  40. tempmin+=;
  41. }
  42. else
  43. {
  44. flag=;
  45. break;
  46. }
  47. }
  48. if(flag) printf("Case #%d: YES\n",t1);
  49. else printf("Case #%d: NO\n",t1);
  50. }
  51. return ;
  52. }

Problem B. Dance Battle:

维护一下循环头尾,贪心即可。

  1. #include<bits/stdc++.h>
  2. #define rep(i,a,b) for(int i=a;i<=b;i++)
  3. using namespace std;
  4. const int MAXN=;
  5. int a[MAXN];
  6. int main()
  7. {
  8. freopen("B-large.in","r",stdin);
  9. freopen("B-large.out","w",stdout);
  10. int T,e,n,head,tail,ans;
  11. scanf("%d",&T);
  12. rep(t1,,T)
  13. {
  14. ans=;
  15. scanf("%d%d",&e,&n);
  16. rep(i,,n) scanf("%d",&a[i]);
  17. sort(a+,a+n+);
  18. head=;tail=n;
  19. while(head<tail)
  20. {
  21. while(e>a[head]&&head<tail)
  22. {
  23. e-=a[head++];
  24. ans++;
  25. }
  26. if(ans==) break;
  27. if(tail>head)
  28. {
  29. e+=a[tail--];
  30. ans--;
  31. }
  32. }
  33. if(e>a[head]) ans++;
  34. printf("Case #%d: %d\n",t1,ans);
  35. }
  36. return ;
  37. }

Problem C. Catch Them All

把题意抽象一下:

    给一个N个点M条边的无向图。

    初始时人会等概率随机出生在地图上某个点上,之后每一轮等概率随机去地图上的另外N-1个点中的某一个。(即以1/N-1的概率前往他所在的点以外的N-1个点中的某一个)。每次走的都是最短路。

    问:P轮后总路程的期望。

数据范围:

1 ≤ T ≤ 100.

2 ≤ N ≤ 100.
1 ≤ P ≤ 109.

  以轮数为阶段,考虑第i轮到达各个点的期望与第i+1轮到达各个点的期望之间的线性递推关系。

  然后矩阵快速幂。

  

  1. #include<bits/stdc++.h>
  2. #define rep(i,a,b) for(int i=a;i<=b;i++)
  3. using namespace std;
  4. const int MAXN=;
  5. int d[][];
  6. double ans;
  7. int n,m,p;
  8. const int INF=~0U>>;
  9. int F_1[];
  10. typedef struct matrix
  11. {
  12. int r;
  13. double a[MAXN][MAXN];
  14. matrix(int rr):r(rr)
  15. {
  16. for(int i=;i<r;++i)
  17. {
  18. for(int j=;j<r;++j) a[i][j]=;
  19. }
  20. }
  21. void m0()
  22. {
  23. for(int i=;i<r;++i)
  24. {
  25. for(int j=;j<r;++j) a[i][j]=;
  26. }
  27. }
  28. void me()
  29. {
  30. for(int i=;i<r;++i)
  31. {
  32. for(int j=;j<r;++j)
  33. {
  34. if(i==j) a[i][j]=;
  35. else a[i][j]=0.0;
  36. }
  37. }
  38. }
  39. matrix operator *(const matrix B)const
  40. {
  41. matrix tmp(r);
  42. for(int i=;i<r;++i)
  43. {
  44. for(int j=;j<r;++j)
  45. {
  46. for(int k=;k<r;++k)
  47. tmp.a[i][j]+=a[i][k]*B.a[k][j];
  48. }
  49. }
  50. return tmp;
  51. }
  52.  
  53. }mat;
  54. mat Pow(mat A,int t)
  55. {
  56. mat res(A.r);
  57. res.me();
  58. while(t)
  59. {
  60. if(t&) res=A*res;
  61. A=A*A;
  62. t=t/;;
  63. }
  64. return res;
  65. }
  66. mat Ans(n);
  67. void init()
  68. {
  69. memset(d,0x3f,sizeof(d));
  70. scanf("%d%d%d",&n,&m,&p);
  71. int u,v,w;
  72. rep(i,,m)
  73. {
  74. scanf("%d%d%d",&u,&v,&w);
  75. d[u][v]=d[v][u]=w;
  76. }
  77. Ans.r=n+;
  78. Ans.m0();
  79. rep(i,,n) d[i][i]=;
  80. rep(k,,n)
  81. {
  82. rep(i,,n)
  83. {
  84. rep(j,,n)
  85. {
  86. if(d[i][j]>d[i][k]+d[k][j]) d[i][j]=d[i][k]+d[k][j];
  87. }
  88. }
  89. }
  90. rep(i,,n)
  91. {
  92. d[i][]=;
  93. rep(j,,n)
  94. {
  95. d[i][]+=d[i][j];
  96. }
  97. }
  98. /* F_1[1]=0;
  99. rep(i,2,n) F_1[i]=d[1][i];
  100. F_1[n+1]=1;*/
  101. // mat Ans;
  102. rep(i,,n-)
  103. {
  104. rep(j,,n)
  105. {
  106. if(j==n) Ans.a[i][j]=(double)d[i+][]/(n-);
  107. else if(i==j) Ans.a[i][j]=;
  108. else Ans.a[i][j]=(double)/(n-);
  109. }
  110. }
  111. Ans.a[n][n]=1.0;
  112. /* rep(i,0,n)
  113. {
  114. rep(j,0,n)
  115. {
  116. printf("%.5f ",Ans.a[i][j]);
  117. }
  118. printf("\n");
  119. }*/
  120. }
  121. void work()
  122. {
  123. mat temp(n);
  124. temp=Pow(Ans,p);
  125. ans=0.0;
  126. ans=temp.a[][n];
  127. }
  128. int main()
  129. {
  130. // freopen("in.txt","r",stdin);
  131. freopen("C-large-practice.in","r",stdin);
  132. freopen("C-large-practice.out","w",stdout);
  133. int T;
  134. scanf("%d",&T);
  135. rep(t1,,T)
  136. {
  137. init();
  138. work();
  139. printf("Case #%d: %.6f\n",t1,ans);
  140. }
  141. return ;
  142. }

Problem D. Eat Cake

  裸DP。大水题。差评。

  

google Kickstart Round F 2017 四道题题解的更多相关文章

  1. google Kickstart Round G 2017 三道题题解

    A题:给定A,N,P,计算A的N!次幂对P取模的结果. 数据范围: T次测试,1 ≤ T ≤ 100 1<=A,N,P<=105 快速幂一下就好了.O(nlogn). AC代码: #inc ...

  2. Kickstart Round D 2017 problem A sightseeing 一道DP

    这是现场完整做出来的唯一一道题Orz..而且还调了很久的bug.还是太弱了. Problem When you travel, you like to spend time sightseeing i ...

  3. 2019 google kickstart round A

    第一题: n个人,每个人有一个对应的技能值s,现在要从n个人中选出p个人,使得他们的技能值相同. 显然,如果存在p个人的技能值是相同的,输出0就可以了.如果不存在,就要找出p个人,对他们进行训练,治他 ...

  4. Kickstart Round D 2017 : A

    思路: 动态规划. large数据的时间范围很大,无法设计入状态中.转换思路为定义dp[i][j]为当前在景点i,并且已经游览了j个景点所花费的最小时间,这种思想与leetcode45类似.于是转移方 ...

  5. Google Kickstart Round.B C. Diverse Subarray

    这题又是万恶的线段树 maxx[j]存储的是 l = xxx, r = j的时候的答案 我们会让 l 从 1到n 的遍历中,查询线段树的[l, n]中最大的答案 因为query的下界是n,所以单次查询 ...

  6. Google Kickstart Round E 2018 B. Milk Tea

    太蠢了,,,因为初始化大数据没过,丢了10分,纪念一下这个错误 大概思路:先求出让损失值最小的排列,由已生成的这些排列,通过更改某一个位置的值,生成下一个最优解,迭代最多生成m+1个最优解即可,遍历求 ...

  7. Google Kickstart在线测试规则以及注意事项

    谷歌招聘在如火如荼的进行中,进谷歌都需要经过谷歌kickstart在线测试,然后过了之后还有五轮的面试- -.好吧毕竟你待遇高,你强你有理.. 下面介绍一下进谷歌的第一关google kickstar ...

  8. # Codeforces Round #529(Div.3)个人题解

    Codeforces Round #529(Div.3)个人题解 前言: 闲来无事补了前天的cf,想着最近刷题有点点怠惰,就直接一场cf一场cf的刷算了,以后的题解也都会以每场的形式写出来 A. Re ...

  9. Google Summer of Code 2017 经验谈

    Google Summer of Code (GSoC) 2018 又要开始了. 如果想实现你心中的开源梦想, 用代码让世界变得更美好. 参加GSoC可能是你进入开源的世界最好途径. GSoC是什么 ...

随机推荐

  1. [luogu P2633] Count on a tree

    [luogu P2633] Count on a tree 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点 ...

  2. angular6 aot 预先编译

    angular.json文件:(红色加粗部分) { "$schema": "./node_modules/@angular/cli/lib/config/schema.j ...

  3. Linux文件系统目录

    Linux操作系统目录呈树形结构,文件系统只有一个根目录,其余文件都是从根目录下延伸出来的 上图是一个Linux文件系统目录的展现,现在我们来看一下文件系统目录下相关目录及其功能 根目录( / ) L ...

  4. redis常用命令使用集

    redis集群:https://www.cnblogs.com/PatrickLiu/p/8435214.html Redis命令总结 1.基于内存的key-value数据库 2.基于c语言编写的,可 ...

  5. mysql 自定义插件调试

    # 创建表的stack frame #0: 0x000000011d11f58a ha_spartan.so`Spartan_data::create_table(this=0x00007f9fc13 ...

  6. JS的全局变量与局部变量及变量的提升

    遇到全局变量与局部变量的时候总是出一些或多或少的问题,于是专门花时间去认真研究了一下全局变量与局部变量. 这是在网上看到的一个关于全局变量与局部变量的代码,看了下作者的解析,自己也进行了研究. < ...

  7. UML介绍

    UML是什么 Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于1997年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所 ...

  8. 二、linux的安装

    1. 虚拟机安装: 1.1. 什么是虚拟机 虚拟机:一台虚拟的电脑. 虚拟机软件: * VmWare :收费的. * VirtualBox :免费的. 1.2. 安装VmWare 参考<虚拟软件 ...

  9. 用户认证:基于jwt和session的区别和优缺点

    背景知识: Authentication和Authorization的区别: Authentication:用户认证,指的是验证用户的身份,例如你希望以小A的身份登录,那么应用程序需要通过用户名和密码 ...

  10. [Oracle][DATAGUARD] 关于确认PHYSICAL STANDBY的同期状况的方法

    补上简单的确认PHYSICAL STANDBY的同期状况的方法: ODM TEST CASE===================Name = TC#1010_3 ####Primary#### SQ ...