A题:
给定A,N,P,计算A的N!次幂对P取模的结果。

数据范围:

T次测试,1 ≤ T ≤ 100

1<=A,N,P<=105

快速幂一下就好了。O(nlogn)。

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=1e5+1e4;
  5. long long mo[MAXN];
  6. int TT;
  7. long long a,n,p,ans;
  8. long long fast(long long x,long long k)
  9. {
  10. long long res=;
  11. while(k)
  12. {
  13. if(k&) res=res*x%p;
  14. x=x*x%p;
  15. k=k>>;
  16. }
  17. return res;
  18. }
  19. void work()
  20. {
  21. a=a%p;
  22. mo[]=a;
  23. rep(i,,n)
  24. {
  25. mo[i]=fast(mo[i-],i)%p;
  26. }
  27. }
  28. int main()
  29. {
  30. freopen("A-large-practice.in","r",stdin);
  31. freopen("A-large-practice.out","w",stdout);
  32. scanf("%d",&TT);
  33. for(int t1=;t1<=TT;++t1)
  34. {
  35. scanf("%lld%lld%lld",&a,&n,&p);
  36. work();
  37. printf("Case #%d: %lld\n",t1,mo[n]);
  38. }
  39. return ;
  40. }

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代码:

  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 n,tot,cnt;
  6. long long sum;
  7. int r[MAXN];
  8. int l[MAXN],father[MAXN];
  9. struct Edge
  10. {
  11. int to,from;
  12. int val;
  13. Edge() {}
  14. Edge(int a,int b,int c) {to=a,from=b,val=c;}
  15. }edge[MAXN*MAXN];
  16. inline void addedge(int a,int b,int c)
  17. {
  18. edge[tot++]=Edge(a,b,c);
  19. }
  20. bool cmp(Edge x,Edge y)
  21. {
  22. return x.val<y.val;
  23. }
  24. inline void Input()
  25. {
  26. scanf("%d",&n);
  27. rep(i,,n)
  28. {
  29. scanf("%d",&r[i]);
  30. }
  31. rep(i,,n)
  32. {
  33. scanf("%d",&l[i]);
  34. }
  35. }
  36. inline void init()
  37. {
  38. tot=;
  39. rep(i,,n)
  40. {
  41. rep(j,i+,n)
  42. {
  43. addedge(i,j,r[i]^l[j]);
  44. addedge(j,i,l[i]^r[j]);
  45. }
  46. }
  47. rep(i,,n) father[i]=i;
  48. sort(edge,edge+tot,cmp);
  49. }
  50. int findfa(int x)
  51. {
  52. if(father[x]==x) return x;
  53. else return father[x]=findfa(father[x]);
  54. }
  55. int uni(int x,int y)
  56. {
  57. int fx=findfa(x);
  58. int fy=findfa(y);
  59. father[fy]=fx;
  60. }
  61. void kruskal()
  62. {
  63. cnt=;
  64. sum=;
  65. rep(i,,tot-)
  66. {
  67. if(findfa(edge[i].to)!=findfa(edge[i].from))
  68. {
  69. uni(edge[i].to,edge[i].from);
  70. cnt++;
  71. sum+=edge[i].val;
  72. }
  73. if(cnt==n-) break;
  74. }
  75. }
  76. int main()
  77. {
  78. freopen("B-large-practice.in","r",stdin);
  79. freopen("B-large-practice.out","w",stdout);
  80. int TT;
  81. scanf("%d",&TT);
  82. rep(t1,,TT)
  83. {
  84. Input();
  85. init();
  86. kruskal();
  87. printf("Case #%d: %lld\n",t1,sum);
  88. }
  89. return ;
  90. }

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代码:

  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. const int INF=0x3f3f3f3f;
  6. int n,m;
  7. int a[MAXN][MAXN];
  8. int dp[MAXN][MAXN][MAXN][MAXN];
  9. int mi[MAXN][MAXN][MAXN][MAXN];
  10. inline void initmi(int x,int y)
  11. {
  12. rep(i,x-,n) mi[x][y][i][y-]=INF;
  13. rep(j,y-,m) mi[x][y][x-][j]=INF;
  14. }
  15. void Input()
  16. {
  17. scanf("%d%d",&n,&m);
  18. // printf("n=%d m=%d\n",n,m);
  19. rep(i,,n)
  20. {
  21. rep(j,,m)
  22. {
  23. scanf("%d",&a[i][j]);
  24. }
  25. }
  26. rep(i,,n) //×óÉϽǶ¥µã
  27. {
  28. rep(j,,m)
  29. {
  30. // printf("i=%d j=%d\n",i,j);
  31. initmi(i,j);
  32. rep(p,i,n) //ÓÒϽǶ¥µã
  33. {
  34. rep(q,j,m)
  35. {
  36. mi[i][j][p][q]=min(min(a[p][q],mi[i][j][p-][q]),mi[i][j][p][q-]);
  37. // printf("%d ",mi[i][j][p][q]);
  38. }
  39. // printf("\n");
  40. }
  41. }
  42. }
  43. memset(dp,,sizeof(dp));
  44. }
  45. int f(int u,int d,int l,int r)
  46. {
  47. if(u==d&&l==r) return ;
  48. // 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]);
  49. if(dp[u][d][l][r]>) return dp[u][d][l][r];
  50. int ans=;
  51. rep(i,u,d-)
  52. {
  53. ans=max(ans,f(u,i,l,r)+f(i+,d,l,r));
  54. }
  55. rep(j,l,r-)
  56. {
  57. ans=max(ans,f(u,d,l,j)+f(u,d,j+,r));
  58. }
  59. dp[u][d][l][r]=ans+mi[u][l][d][r];
  60. return ans+mi[u][l][d][r];
  61. }
  62. int main()
  63. {
  64. freopen("C-large-practice.in","r",stdin);
  65. freopen("C-large-practice.out","w",stdout);
  66. int TT;
  67. scanf("%d",&TT);
  68. rep(t1,,TT)
  69. {
  70. Input();
  71. printf("Case #%d: %d\n",t1,f(,n,,m));
  72. }
  73. return ;
  74. }

google Kickstart Round G 2017 三道题题解的更多相关文章

  1. google Kickstart Round F 2017 四道题题解

    Problem A. Kicksort 题意抽象一下为: 对于一个每次都从数列正中间取划分数的快速排序,给定一个1-n的排列,问快排的复杂度对于这个排列是否会退化为最坏复杂度. 数据范围: 测试组数1 ...

  2. bestcoder Round #7 前三题题解

    BestCoder Round #7 Start Time : 2014-08-31 19:00:00    End Time : 2014-08-31 21:00:00Contest Type : ...

  3. 2019 google kickstart round A

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

  4. BestCoder Round #86 二,三题题解(尺取法)

    第一题太水,跳过了. NanoApe Loves Sequence题目描述:退役狗 NanoApe 滚回去学文化课啦! 在数学课上,NanoApe 心痒痒又玩起了数列.他在纸上随便写了一个长度为 nn ...

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

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

  6. BestCoder Round #85 前三题题解

    sum Accepts: 822 Submissions: 1744 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/13107 ...

  7. Google Kickstart Round.B C. Diverse Subarray

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

  8. Kickstart Round G 2018

    第一次打codejam....惨的一比,才A1.5题,感觉自己最近状态渣到姥姥家了,赶紧练练 A 模拟,注意0的问题 #include <iostream> #include <cs ...

  9. Google Kickstart Round E 2018 B. Milk Tea

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

随机推荐

  1. detours express版本的使用

    原文最早发表于百度空间2012-03-21 一.编译lib 1)拷贝它的src文件夹和system.mak文件到VS的VCVARS32.BAT所在的目录下 2)在命令提示符中运行VCVARS32.BA ...

  2. Docker Swarm 配置文件存储

    Docker Swarm 配置文件存储 config:宿主级容器服务配置文件单独保存到docker中存储调用. 环境: 系统:Centos 7.4 x64 应用版本:Docker 18.09.0 管理 ...

  3. Java访问权限修饰符public protected friendly private用法总结(转载好文Mark)

    首先声明:Java中,friendly这个修饰符并没有显式的声明,在成员变量和方法前什么修饰符也不用,默认的就是friendly.为了条理清晰,分三种不同情况来总结. 一 访问权限修饰符修饰成员变量和 ...

  4. flask --- 04 . 偏函数, 线程安全,栈堆,

    一.偏函数(partial) ①第一种 结果为: ② 第二种 二.线程安全 将空间转换成时间 问题: 1秒钟打印所有结果 threading.current_thread().ident :线程ID ...

  5. Intellij IDEA的下载安装与破解

    一,下载与安装 1.官网下载:https://www.jetbrains.com/idea/ 2.选择Windows对应版本安装 二,破解 1.下载破解补丁:http://idea.lanyus.co ...

  6. Something on RoIAlign --- basic introduction and implementation

    Something on RoIAlign --- basic introduction and implementation 2018-10-22 22:40:09 Paper: Mask RCNN ...

  7. minicom 安装 查看串口

    因为现在电脑基本不配备串行接口,所以,usb转串口成为硬件调试时的必然选择.目前知道的,PL2303的驱动是有的,在dev下的名称是ttyUSB0 默认情况下ubuntu已经安装了USB转串口驱动(p ...

  8. 解决同一activity下多个fragment 切换时重复执行onCreateView方法

    Fragment之间切换时每次都会调用onCreateView方法,导致每次Fragment的布局都重绘,无法保持Fragment原有状态. 解决的办法是:在Fragment onCreateView ...

  9. SQL SERVER 触发器之After,Instead of

    [Ater](同for)先执行增删改操作,再执行触发器操作 [Instead of]直接只执行触发器里的 create trigger triggername on table_name for/af ...

  10. js中用户名的正则(字符,数字,下划线,减号)

    <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Inse ...