google Kickstart Round F 2017 四道题题解
Problem A. Kicksort
题意抽象一下为:
对于一个每次都从数列正中间取划分数的快速排序,给定一个1-n的排列,问快排的复杂度对于这个排列是否会退化为最坏复杂度。
数据范围: 测试组数1 ≤ T ≤ 100. 2 ≤ N ≤ 10000.
思路:
如连连看一般在一列数中反复消去正中间一个,判断其是否一直是目前数列的最小元素或最大元素。
模拟即可,维护一个当前数列最小值,当前数列最大值,消去边界l和r。(注意到每次消去的元素在原数列中必然组成一个连续区间)
每次判断消去边界应该左移还是右移,消去数是否为当前数列最小值或最大值,是则更新最小值或最大值,否则输出NO。
AC代码:
- #include<bits/stdc++.h>
- #define rep(i,a,b) for(int i=a;i<=b;i++)
- using namespace std;
- const int MAXN=;
- int a[MAXN];
- int main()
- {
- // freopen("in.txt","r",stdin);
- freopen("A-large (1).in","r",stdin);
- freopen("A-large (1).out","w",stdout);
- int T,n,tempmax,tempmin,l,r,mid;
- scanf("%d",&T);
- rep(t1,,T)
- {
- scanf("%d",&n);
- for(int i=;i<n;++i) scanf("%d",&a[i]);
- tempmax=n;
- tempmin=;
- int flag=;
- l=(n-)/;r=l+;
- rep(i,,n-)
- {
- mid=(l+n-r)/;
- if(mid<=l)
- {
- mid=l;
- l--;
- }
- else
- {
- mid=r;
- r++;
- }
- if(a[mid]==tempmax)
- {
- tempmax-=;
- }
- else if(a[mid]==tempmin)
- {
- tempmin+=;
- }
- else
- {
- flag=;
- break;
- }
- }
- if(flag) printf("Case #%d: YES\n",t1);
- else printf("Case #%d: NO\n",t1);
- }
- return ;
- }
Problem B. Dance Battle:
维护一下循环头尾,贪心即可。
- #include<bits/stdc++.h>
- #define rep(i,a,b) for(int i=a;i<=b;i++)
- using namespace std;
- const int MAXN=;
- int a[MAXN];
- int main()
- {
- freopen("B-large.in","r",stdin);
- freopen("B-large.out","w",stdout);
- int T,e,n,head,tail,ans;
- scanf("%d",&T);
- rep(t1,,T)
- {
- ans=;
- scanf("%d%d",&e,&n);
- rep(i,,n) scanf("%d",&a[i]);
- sort(a+,a+n+);
- head=;tail=n;
- while(head<tail)
- {
- while(e>a[head]&&head<tail)
- {
- e-=a[head++];
- ans++;
- }
- if(ans==) break;
- if(tail>head)
- {
- e+=a[tail--];
- ans--;
- }
- }
- if(e>a[head]) ans++;
- printf("Case #%d: %d\n",t1,ans);
- }
- return ;
- }
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轮到达各个点的期望之间的线性递推关系。
然后矩阵快速幂。
- #include<bits/stdc++.h>
- #define rep(i,a,b) for(int i=a;i<=b;i++)
- using namespace std;
- const int MAXN=;
- int d[][];
- double ans;
- int n,m,p;
- const int INF=~0U>>;
- int F_1[];
- typedef struct matrix
- {
- int r;
- double a[MAXN][MAXN];
- matrix(int rr):r(rr)
- {
- for(int i=;i<r;++i)
- {
- for(int j=;j<r;++j) a[i][j]=;
- }
- }
- void m0()
- {
- for(int i=;i<r;++i)
- {
- for(int j=;j<r;++j) a[i][j]=;
- }
- }
- void me()
- {
- for(int i=;i<r;++i)
- {
- for(int j=;j<r;++j)
- {
- if(i==j) a[i][j]=;
- else a[i][j]=0.0;
- }
- }
- }
- matrix operator *(const matrix B)const
- {
- matrix tmp(r);
- for(int i=;i<r;++i)
- {
- for(int j=;j<r;++j)
- {
- for(int k=;k<r;++k)
- tmp.a[i][j]+=a[i][k]*B.a[k][j];
- }
- }
- return tmp;
- }
- }mat;
- mat Pow(mat A,int t)
- {
- mat res(A.r);
- res.me();
- while(t)
- {
- if(t&) res=A*res;
- A=A*A;
- t=t/;;
- }
- return res;
- }
- mat Ans(n);
- void init()
- {
- memset(d,0x3f,sizeof(d));
- scanf("%d%d%d",&n,&m,&p);
- int u,v,w;
- rep(i,,m)
- {
- scanf("%d%d%d",&u,&v,&w);
- d[u][v]=d[v][u]=w;
- }
- Ans.r=n+;
- Ans.m0();
- rep(i,,n) d[i][i]=;
- rep(k,,n)
- {
- rep(i,,n)
- {
- rep(j,,n)
- {
- if(d[i][j]>d[i][k]+d[k][j]) d[i][j]=d[i][k]+d[k][j];
- }
- }
- }
- rep(i,,n)
- {
- d[i][]=;
- rep(j,,n)
- {
- d[i][]+=d[i][j];
- }
- }
- /* F_1[1]=0;
- rep(i,2,n) F_1[i]=d[1][i];
- F_1[n+1]=1;*/
- // mat Ans;
- rep(i,,n-)
- {
- rep(j,,n)
- {
- if(j==n) Ans.a[i][j]=(double)d[i+][]/(n-);
- else if(i==j) Ans.a[i][j]=;
- else Ans.a[i][j]=(double)/(n-);
- }
- }
- Ans.a[n][n]=1.0;
- /* rep(i,0,n)
- {
- rep(j,0,n)
- {
- printf("%.5f ",Ans.a[i][j]);
- }
- printf("\n");
- }*/
- }
- void work()
- {
- mat temp(n);
- temp=Pow(Ans,p);
- ans=0.0;
- ans=temp.a[][n];
- }
- int main()
- {
- // freopen("in.txt","r",stdin);
- freopen("C-large-practice.in","r",stdin);
- freopen("C-large-practice.out","w",stdout);
- int T;
- scanf("%d",&T);
- rep(t1,,T)
- {
- init();
- work();
- printf("Case #%d: %.6f\n",t1,ans);
- }
- return ;
- }
Problem D. Eat Cake
裸DP。大水题。差评。
google Kickstart Round F 2017 四道题题解的更多相关文章
- 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 ...
- Kickstart Round D 2017 problem A sightseeing 一道DP
这是现场完整做出来的唯一一道题Orz..而且还调了很久的bug.还是太弱了. Problem When you travel, you like to spend time sightseeing i ...
- 2019 google kickstart round A
第一题: n个人,每个人有一个对应的技能值s,现在要从n个人中选出p个人,使得他们的技能值相同. 显然,如果存在p个人的技能值是相同的,输出0就可以了.如果不存在,就要找出p个人,对他们进行训练,治他 ...
- Kickstart Round D 2017 : A
思路: 动态规划. large数据的时间范围很大,无法设计入状态中.转换思路为定义dp[i][j]为当前在景点i,并且已经游览了j个景点所花费的最小时间,这种思想与leetcode45类似.于是转移方 ...
- Google Kickstart Round.B C. Diverse Subarray
这题又是万恶的线段树 maxx[j]存储的是 l = xxx, r = j的时候的答案 我们会让 l 从 1到n 的遍历中,查询线段树的[l, n]中最大的答案 因为query的下界是n,所以单次查询 ...
- Google Kickstart Round E 2018 B. Milk Tea
太蠢了,,,因为初始化大数据没过,丢了10分,纪念一下这个错误 大概思路:先求出让损失值最小的排列,由已生成的这些排列,通过更改某一个位置的值,生成下一个最优解,迭代最多生成m+1个最优解即可,遍历求 ...
- Google Kickstart在线测试规则以及注意事项
谷歌招聘在如火如荼的进行中,进谷歌都需要经过谷歌kickstart在线测试,然后过了之后还有五轮的面试- -.好吧毕竟你待遇高,你强你有理.. 下面介绍一下进谷歌的第一关google kickstar ...
- # Codeforces Round #529(Div.3)个人题解
Codeforces Round #529(Div.3)个人题解 前言: 闲来无事补了前天的cf,想着最近刷题有点点怠惰,就直接一场cf一场cf的刷算了,以后的题解也都会以每场的形式写出来 A. Re ...
- Google Summer of Code 2017 经验谈
Google Summer of Code (GSoC) 2018 又要开始了. 如果想实现你心中的开源梦想, 用代码让世界变得更美好. 参加GSoC可能是你进入开源的世界最好途径. GSoC是什么 ...
随机推荐
- [luogu P2633] Count on a tree
[luogu P2633] Count on a tree 题目描述 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点 ...
- angular6 aot 预先编译
angular.json文件:(红色加粗部分) { "$schema": "./node_modules/@angular/cli/lib/config/schema.j ...
- Linux文件系统目录
Linux操作系统目录呈树形结构,文件系统只有一个根目录,其余文件都是从根目录下延伸出来的 上图是一个Linux文件系统目录的展现,现在我们来看一下文件系统目录下相关目录及其功能 根目录( / ) L ...
- redis常用命令使用集
redis集群:https://www.cnblogs.com/PatrickLiu/p/8435214.html Redis命令总结 1.基于内存的key-value数据库 2.基于c语言编写的,可 ...
- mysql 自定义插件调试
# 创建表的stack frame #0: 0x000000011d11f58a ha_spartan.so`Spartan_data::create_table(this=0x00007f9fc13 ...
- JS的全局变量与局部变量及变量的提升
遇到全局变量与局部变量的时候总是出一些或多或少的问题,于是专门花时间去认真研究了一下全局变量与局部变量. 这是在网上看到的一个关于全局变量与局部变量的代码,看了下作者的解析,自己也进行了研究. < ...
- UML介绍
UML是什么 Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于1997年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所 ...
- 二、linux的安装
1. 虚拟机安装: 1.1. 什么是虚拟机 虚拟机:一台虚拟的电脑. 虚拟机软件: * VmWare :收费的. * VirtualBox :免费的. 1.2. 安装VmWare 参考<虚拟软件 ...
- 用户认证:基于jwt和session的区别和优缺点
背景知识: Authentication和Authorization的区别: Authentication:用户认证,指的是验证用户的身份,例如你希望以小A的身份登录,那么应用程序需要通过用户名和密码 ...
- [Oracle][DATAGUARD] 关于确认PHYSICAL STANDBY的同期状况的方法
补上简单的确认PHYSICAL STANDBY的同期状况的方法: ODM TEST CASE===================Name = TC#1010_3 ####Primary#### SQ ...