google Kickstart Round G 2017 三道题题解
A题:
给定A,N,P,计算A的N!次幂对P取模的结果。
数据范围:
T次测试,1 ≤ T ≤ 100
1<=A,N,P<=105
快速幂一下就好了。O(nlogn)。
AC代码:
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int MAXN=1e5+1e4;
long long mo[MAXN];
int TT;
long long a,n,p,ans;
long long fast(long long x,long long k)
{
long long res=;
while(k)
{
if(k&) res=res*x%p;
x=x*x%p;
k=k>>;
}
return res;
}
void work()
{
a=a%p;
mo[]=a;
rep(i,,n)
{
mo[i]=fast(mo[i-],i)%p;
}
}
int main()
{
freopen("A-large-practice.in","r",stdin);
freopen("A-large-practice.out","w",stdout);
scanf("%d",&TT);
for(int t1=;t1<=TT;++t1)
{
scanf("%lld%lld%lld",&a,&n,&p);
work();
printf("Case #%d: %lld\n",t1,mo[n]);
}
return ;
}
B题:
图论建模挺巧妙。
题目大意为你有n张牌,正反面各一个数,记为Ri,Bi。
每次操作可以选出两张牌i,j
你可以选择积分增加Ri^Bj或者增加Rj^Bi
从两张牌中选出一张移出游戏,另一张放回牌堆。
反复操作直至只剩一张牌。
要求游戏结束时积分最小。输出最小积分。
数据范围:
T次测试,1<=T<=100
1<=N<=100
1 ≤ Ri ≤ 109
1 ≤ Bi≤ 109
我看了google给的思路才会的,惭愧。
首先注意到双向性:增加同样的积分,操作既可以移出i也可以移出j
然后注意到一共必然是n-1次操作。
考虑把每张牌视作一个点,一个从开始到结束的策略即为一个图上的生成树。
求最小生成树即可。
O(ElogE)
AC代码:
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int MAXN=;
int n,tot,cnt;
long long sum;
int r[MAXN];
int l[MAXN],father[MAXN];
struct Edge
{
int to,from;
int val;
Edge() {}
Edge(int a,int b,int c) {to=a,from=b,val=c;}
}edge[MAXN*MAXN];
inline void addedge(int a,int b,int c)
{
edge[tot++]=Edge(a,b,c);
}
bool cmp(Edge x,Edge y)
{
return x.val<y.val;
}
inline void Input()
{
scanf("%d",&n);
rep(i,,n)
{
scanf("%d",&r[i]);
}
rep(i,,n)
{
scanf("%d",&l[i]);
}
}
inline void init()
{
tot=;
rep(i,,n)
{
rep(j,i+,n)
{
addedge(i,j,r[i]^l[j]);
addedge(j,i,l[i]^r[j]);
}
}
rep(i,,n) father[i]=i;
sort(edge,edge+tot,cmp);
}
int findfa(int x)
{
if(father[x]==x) return x;
else return father[x]=findfa(father[x]);
}
int uni(int x,int y)
{
int fx=findfa(x);
int fy=findfa(y);
father[fy]=fx;
}
void kruskal()
{
cnt=;
sum=;
rep(i,,tot-)
{
if(findfa(edge[i].to)!=findfa(edge[i].from))
{
uni(edge[i].to,edge[i].from);
cnt++;
sum+=edge[i].val;
}
if(cnt==n-) break;
}
}
int main()
{
freopen("B-large-practice.in","r",stdin);
freopen("B-large-practice.out","w",stdout);
int TT;
scanf("%d",&TT);
rep(t1,,TT)
{
Input();
init();
kruskal();
printf("Case #%d: %lld\n",t1,sum);
}
return ;
}
C题:
描述起来有点复杂:
给你一个n*m个格子的矩阵,每个格子里有一个数。
现要将其切成n*m个1*1的格子。
每次只能纵切或者横切。每次切割增加积分的规则如下:
每个独立的子矩阵(就是已经被切开的小矩阵)会贡献一个值,值为这个独立矩阵中的最小元素的值。
要求最后积分最小。
数据范围:
T次测试,1<=T<=100
1<=N,M<=40
记忆化搜索。
先得dp预处理一下子矩阵的最小元素值以供调用。
设mi[i][j][p][q]表示以左上角的点(i,j)和右下角的点(p,q)确定的矩阵中元素的最小值,a[][]存储题目给的矩阵。
固定i,j,枚举p,q
mi[i][j][p][q]为a[i][j],mi[i][j][p-1][q],mi[i][j][p][q-1]三者之间的最小值。O(M^2N^2)
再记忆化搜索一下,O(M^2N^2(M+N))
总复杂度:O(M^2N^2(M+N))
AC代码:
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
const int MAXN=;
const int INF=0x3f3f3f3f;
int n,m;
int a[MAXN][MAXN];
int dp[MAXN][MAXN][MAXN][MAXN];
int mi[MAXN][MAXN][MAXN][MAXN];
inline void initmi(int x,int y)
{
rep(i,x-,n) mi[x][y][i][y-]=INF;
rep(j,y-,m) mi[x][y][x-][j]=INF;
}
void Input()
{
scanf("%d%d",&n,&m);
// printf("n=%d m=%d\n",n,m);
rep(i,,n)
{
rep(j,,m)
{
scanf("%d",&a[i][j]);
}
}
rep(i,,n) //×óÉϽǶ¥µã
{
rep(j,,m)
{
// printf("i=%d j=%d\n",i,j);
initmi(i,j);
rep(p,i,n) //ÓÒϽǶ¥µã
{
rep(q,j,m)
{
mi[i][j][p][q]=min(min(a[p][q],mi[i][j][p-][q]),mi[i][j][p][q-]);
// printf("%d ",mi[i][j][p][q]);
}
// printf("\n");
}
}
}
memset(dp,,sizeof(dp));
}
int f(int u,int d,int l,int r)
{
if(u==d&&l==r) return ;
// printf("u=%d d=%d l=%d r=%d dp=%d mi=%d\n",u,d,l,r,dp[u][d][l][r],mi[u][l][d][r]);
if(dp[u][d][l][r]>) return dp[u][d][l][r];
int ans=;
rep(i,u,d-)
{
ans=max(ans,f(u,i,l,r)+f(i+,d,l,r));
}
rep(j,l,r-)
{
ans=max(ans,f(u,d,l,j)+f(u,d,j+,r));
}
dp[u][d][l][r]=ans+mi[u][l][d][r];
return ans+mi[u][l][d][r];
}
int main()
{
freopen("C-large-practice.in","r",stdin);
freopen("C-large-practice.out","w",stdout);
int TT;
scanf("%d",&TT);
rep(t1,,TT)
{
Input();
printf("Case #%d: %d\n",t1,f(,n,,m));
}
return ;
}
google Kickstart Round G 2017 三道题题解的更多相关文章
- google Kickstart Round F 2017 四道题题解
Problem A. Kicksort 题意抽象一下为: 对于一个每次都从数列正中间取划分数的快速排序,给定一个1-n的排列,问快排的复杂度对于这个排列是否会退化为最坏复杂度. 数据范围: 测试组数1 ...
- bestcoder Round #7 前三题题解
BestCoder Round #7 Start Time : 2014-08-31 19:00:00 End Time : 2014-08-31 21:00:00Contest Type : ...
- 2019 google kickstart round A
第一题: n个人,每个人有一个对应的技能值s,现在要从n个人中选出p个人,使得他们的技能值相同. 显然,如果存在p个人的技能值是相同的,输出0就可以了.如果不存在,就要找出p个人,对他们进行训练,治他 ...
- BestCoder Round #86 二,三题题解(尺取法)
第一题太水,跳过了. NanoApe Loves Sequence题目描述:退役狗 NanoApe 滚回去学文化课啦! 在数学课上,NanoApe 心痒痒又玩起了数列.他在纸上随便写了一个长度为 nn ...
- Kickstart Round D 2017 problem A sightseeing 一道DP
这是现场完整做出来的唯一一道题Orz..而且还调了很久的bug.还是太弱了. Problem When you travel, you like to spend time sightseeing i ...
- BestCoder Round #85 前三题题解
sum Accepts: 822 Submissions: 1744 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/13107 ...
- Google Kickstart Round.B C. Diverse Subarray
这题又是万恶的线段树 maxx[j]存储的是 l = xxx, r = j的时候的答案 我们会让 l 从 1到n 的遍历中,查询线段树的[l, n]中最大的答案 因为query的下界是n,所以单次查询 ...
- Kickstart Round G 2018
第一次打codejam....惨的一比,才A1.5题,感觉自己最近状态渣到姥姥家了,赶紧练练 A 模拟,注意0的问题 #include <iostream> #include <cs ...
- Google Kickstart Round E 2018 B. Milk Tea
太蠢了,,,因为初始化大数据没过,丢了10分,纪念一下这个错误 大概思路:先求出让损失值最小的排列,由已生成的这些排列,通过更改某一个位置的值,生成下一个最优解,迭代最多生成m+1个最优解即可,遍历求 ...
随机推荐
- Linux 系统查看对应公网映射地址
最近在解决网络问题时,需要查看本机的出口公网IP信息,所以在网络上搜索和请求运维达人,获得如下两个方法: curl ifconfig.me 在linux系统中输入上述的命令,可以查看到本机连接的公网信 ...
- 谷歌技术"三宝"之GFS
题记:初学分布式文件系统,写篇博客加深点印象.GFS的特点是使用一堆廉价的商用计算机支撑大规模数据处理. 虽然"The Google File System " 是03年发表的老文 ...
- java限制map大小,并FIFO淘汰
有时候需要往一个MAP中写入一些记录,但又怕无限制地写入会导致内存爆掉,所以得限制这个MAP的大小. 实现:LinkedHashMap提供了简单的方法. 首先,定义一个最大数,比如1000,然后new ...
- 【问题解决:启动卡死】Eclipse启动卡死的解决办法
问题描述 Eclipse启动后卡死 问题分析 由于上一次没有正确关闭,导致在启动的时候开始 问题解决 方法1(推荐): 到<workspace>\.metadata\.plugins\or ...
- HTML基础【5】:表单标签
表单标签 作用:用于收集用户信息,让用户填写.选择相关信息 格式: <from> 表单标签 </from> 注意事项: 所有的表单内容,都要写在form标签里面 form标签中 ...
- (17)线程队列---queue LifoQueue PriorityQueue
线程常用队列有: queue LifoQueue PriorityQueue 语法: 大致和进程队列语法一致 put 往队列当中放值,超过队列长度,直接加阻塞 get 如果获取不到加阻塞 put_no ...
- ionic UI Component Slides使用:手动滑动后自动滑动失效解决
在使用ionic的UI组件Slides时,发现手动滑动后,自动滑动失效 然后历经一点点的艰辛查找后找到方法,如下: 页面代码使用 <ion-slides pager loop="tru ...
- EF连接Sqlserver2014,使用DBGeography时提示无法加载sqlserverspatial.dll
(1)确认你要使用的SqlServer版本,如果是2014,就要在nuget中添加microsoft.sqlserver.types.dll,使用12.0.4100.1这个版本,它会自动添加sqlse ...
- linux安装elasticsearch-head和elasticsearch-analysis-ik及遇到的各种问题
1.获取elasticsearch-head http://mobz.github.io/elasticsearch-head/ 下载并解压 wget https://github.com/mobz/ ...
- DNS及DNS有什么作用
什么是DNS,DNS有什么作用: DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直 ...