决赛,我自我认为题目难度更大,反而我的心态更好了。

由于放轻松的时候反而效果更好,跟昨天的观点一样,凡是可以1A的,才算这题做得好。

A.数目不大,关键是看懂题(我自己连输入输出是什么都不清楚。。。。

然后管理员就把题下掉了。

。。批评批评啊。

。。

)bin神的代码膜拜了下。知道是状态压缩,题中说了最多6个,要么1<<6枚举,要么6!枚举。代码:

  1. /* ***********************************************
  2. Author :kuangbin
  3. Created Time :2015/3/15 14:17:30
  4. File Name :GDUT\A.cpp
  5. ************************************************ */
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <iostream>
  10. #include <algorithm>
  11. #include <vector>
  12. #include <queue>
  13. #include <set>
  14. #include <map>
  15. #include <string>
  16. #include <math.h>
  17. #include <stdlib.h>
  18. #include <time.h>
  19. using namespace std;
  20.  
  21. const int INF = 0x3f3f3f3f;
  22. int dp[1000];
  23. int st[6410],cost[6410];
  24. int num[6410];
  25.  
  26. int main()
  27. {
  28. //freopen("in.txt","r",stdin);
  29. //freopen("out.txt","w",stdout);
  30. int T;
  31. scanf("%d",&T);
  32. while(T--){
  33. int n;
  34. scanf("%d",&n);
  35. int cnt = 0;
  36. for(int i = 0;i < n;i++){
  37. int m;
  38. int nn;
  39. int p;
  40. scanf("%d%d",&m,&nn);
  41. while(m--){
  42. int k;
  43. scanf("%d",&k);
  44. st[cnt] = 0;
  45. num[cnt] = nn;
  46. while(k--){
  47. scanf("%d",&p);
  48. st[cnt] |= (1<<p);
  49. }
  50. scanf("%d",&cost[cnt]);
  51. cnt++;
  52. }
  53. }
  54. for(int i = 0;i < (1<<6);i++)dp[i] = INF;
  55. dp[0] = 0;
  56. for(int i = 0;i < (1<<6);i++){
  57. if(dp[i] == INF)continue;
  58. for(int j = 0;j < cnt;j++){
  59. if( (i&(1<<num[j])) != 0)continue;
  60. if( (i|st[j]) != i )continue;
  61. dp[i|(1<<num[j])] = min(dp[i|(1<<num[j])],dp[i]+cost[j]);
  62. }
  63. }
  64. int tot = (1<<6)-1;
  65. if(dp[tot] == INF)dp[tot] = -1;
  66. printf("%d\n",dp[tot]);
  67. }
  68. return 0;
  69. }

B.区间DP,因为是随意地方插入0或者1,那么单位长度显然ans为0。两个长度作为初始化推断。然后区间DP

代码:

  1. /* ***********************************************
  2. Author :kuangbin
  3. Created Time :2015/3/15 13:05:55
  4. File Name :GDUT\B.cpp
  5. ************************************************ */
  6.  
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <iostream>
  10. #include <algorithm>
  11. #include <vector>
  12. #include <queue>
  13. #include <set>
  14. #include <map>
  15. #include <string>
  16. #include <math.h>
  17. #include <stdlib.h>
  18. #include <time.h>
  19. using namespace std;
  20. char str[1010];
  21. int a[1010];
  22.  
  23. int dp[1010][1010];
  24.  
  25. int main()
  26. {
  27. //freopen("in.txt","r",stdin);
  28. //freopen("out.txt","w",stdout);
  29. int T;
  30. int n;
  31. scanf("%d",&T);
  32. while(T--){
  33. scanf("%d",&n);
  34. scanf("%s",str);
  35. for(int i = 0;i < n;i++)
  36. a[i] = str[i]-'0';
  37. memset(dp,0,sizeof(dp));
  38. for(int i = 0;i < n;i++)
  39. dp[i][i] = 1;
  40. for(int i = n-1;i >= 0;i--)
  41. for(int j = i+1;j < n;j++){
  42. dp[i][j] = j-i+1;
  43. if(a[i] != a[j])
  44. dp[i][j] = min(dp[i][j],dp[i+1][j-1]);
  45. dp[i][j] = min(dp[i][j],dp[i+1][j]+1);
  46. dp[i][j] = min(dp[i][j],dp[i][j-1]+1);
  47. }
  48. printf("%d\n",dp[0][n-1]);
  49. }
  50. return 0;
  51. }

另外,另一种非常好的思路。依照题意来,取反,翻转。那么反复的不须要加入0或者1。转换为最多反复多少个,所以转换为LCS(Longest Common Sequence)代码不须要写吧,O(n^2)的算法。n=1000妥妥的

C.这道题表述上事实上是没有问题的,可是大家会陷于自己生活中的误区,菜怎么可能炒到一半就换种菜?这个题的第一组数据是个非常经典的小学竞赛问题:2个锅,要做出来3个饼,每一个饼须要2分钟做好,问你最少几分钟能够做好?答案是3.过程是这样:第一分钟,做第1和2个饼;第二分钟,做第2和3个饼。第三分钟,做1和3个饼。

那么,非常明显:利用的贪心思想。

把全部的饼尽可能的分到不同的锅里去。

那么就是取平均值的上整数值。可是一个菜不能分成多份,那么就是要统计出最大值,于是,求得就是平均值的上整数值和最大值的较大值。绕口,可是代码非常好懂

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <map>
  6. #include <set>
  7. #include <vector>
  8. #include <string>
  9. #include <cstring>
  10. #include <sstream>
  11. #include <queue>
  12. #include <stack>
  13. using namespace std;
  14.  
  15. #define input freopen("input.txt","r",stdin)
  16. #define output freopen("output.txt","w",stdout)
  17. #define For1(i,a,b) for (i=a;i<b;i++)
  18. #define For2(i,a,b) for (i=a;i<=b;i++)
  19. #define Fill(x,a) memset(x,a,sizeof(x))
  20. #define inf 99999999
  21. #define pi 3.1415926535897932384626433832795028841971
  22.  
  23. int main(){
  24. int t,n,m;
  25. int Max,aver,num;
  26. scanf("%d",&t);
  27. while(t--){
  28. aver=Max=0;
  29. scanf("%d%d",&n,&m);
  30. while(n--){
  31. scanf("%d",&num);
  32. Max=max(Max,num);
  33. aver+=num;
  34. }
  35. aver=(aver+m-1)/m;
  36. printf("%d\n",max(aver,Max));
  37. }
  38. return 0;
  39. }

D.数学题。

假设GCD(a,b)==n   LCM(a,b)==m   那么 m/n  是a b 的互质因子乘积    那就是枚举  1到m/n 互质的对数吧。sqrt(n)的复杂度。明显能够接受

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4. #include<math.h>
  5. #include<set>
  6. #include<iostream>
  7. using namespace std;
  8. typedef long long LL;
  9.  
  10. LL n, m;
  11. LL Gcd(LL x, LL y)
  12. {
  13. if (!y) return x;
  14. else
  15. return Gcd(y, x%y);
  16. }
  17. LL solve(LL n)
  18. {
  19. LL sum = 0;
  20. LL i, j;
  21. for (i = 1; i <= (double)sqrt(n*1.0); i++)
  22. {
  23. if (n%i==0)
  24. {
  25. j = n / i;
  26. if (Gcd(i, j) == 1) ++sum;
  27. }
  28. }
  29. return sum;
  30. }
  31. int main()
  32. {
  33. int T, i, Case = 0, j, k;
  34. //freopen("data.txt", "r", stdin);
  35. scanf("%d", &T);
  36. while (T--)
  37. {
  38. scanf("%lld%lld", &n, &m);
  39. if (m%n)
  40. {
  41. printf("0\n"); continue;
  42. }
  43. LL temp = m / n;
  44. printf("%lld\n", solve(temp));
  45. }
  46. return 0;
  47. }

第五题。并查集基础。我当时煞笔WA了五次。。。

原因就是太过于自信。我的找爸爸直接用的fa[i]而不是getf[i]。

。。。。哭死。

。。

有些细节问题,不要一直提交的啊。。能够先做做别的题冷静冷静,或者自己写几个測试数据,检測下。20分钟罚时非常多的啊

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <map>
  6. #include <set>
  7. #include <vector>
  8. #include <string>
  9. #include <cstring>
  10. #include <sstream>
  11. #include <queue>
  12. #include <stack>
  13. using namespace std;
  14.  
  15. #define input freopen("input.txt","r",stdin)
  16. #define output freopen("output.txt","w",stdout)
  17. #define For1(i,a,b) for (i=a;i<b;i++)
  18. #define For2(i,a,b) for (i=a;i<=b;i++)
  19. #define Fill(x,a) memset(x,a,sizeof(x))
  20. #define inf 99999999
  21. #define pi 3.1415926535897932384626433832795028841971
  22.  
  23. const long long maxn=1000050;
  24. int t;
  25. long long n,m;
  26.  
  27. long long fa[maxn];
  28.  
  29. void init(){
  30. for(long long i=0;i<=n;i++) fa[i]=i;
  31. }
  32.  
  33. long long getf(long long x){
  34. if (fa[x]==x) return x;
  35. return fa[x]=getf(fa[x]);
  36. }
  37.  
  38. int main(){
  39. input;
  40. long long i,j,k;
  41. scanf("%d",&t);
  42. while(t--){
  43. scanf("%lld%lld",&n,&m);
  44. init();
  45. while(m--){
  46. scanf("%lld",&i);
  47. scanf("%lld",&j);
  48. long long fi=getf(i);
  49. long long fj=getf(j);
  50. if (fi!=fj) fa[fi]=fj;
  51. }
  52. k=0;
  53. long long f1=getf(1);
  54. for(i=2;i<=n;i++){
  55. int fi=getf(i);
  56. if (fi!=f1){
  57. fa[fi]=f1;
  58. k++;
  59. }
  60. }
  61. printf("%lld\n",k);
  62. }
  63. return 0;
  64. }

F.模拟。这道题没难度的哈。

依照题目的意思来呗。

要你干啥就干啥。推断n和m仅仅有100怎么循环都只是分的

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <map>
  6. #include <set>
  7. #include <vector>
  8. #include <string>
  9. #include <cstring>
  10. #include <sstream>
  11. #include <queue>
  12. #include <stack>
  13. using namespace std;
  14.  
  15. #define input freopen("input.txt","r",stdin)
  16. #define output freopen("output.txt","w",stdout)
  17. #define For1(i,a,b) for (i=a;i<b;i++)
  18. #define For2(i,a,b) for (i=a;i<=b;i++)
  19. #define Fill(x,a) memset(x,a,sizeof(x))
  20. #define inf 99999999
  21. #define pi 3.1415926535897932384626433832795028841971
  22.  
  23. int vis[200];
  24. int num[200];
  25. int main(){
  26. //input;
  27. int t;
  28. int n,m;
  29. int i,j,k;
  30. scanf("%d",&t);
  31. while(t--){
  32. memset(vis,0,sizeof(vis));
  33. scanf("%d%d",&n,&m);
  34. for(i=1;i<=m;i++) scanf("%d",&num[i]);
  35.  
  36. for(i=1;i<=m;i++)
  37. for(j=1;j<=n;j++){
  38. if (vis[j]) continue;
  39. if (j>=num[i]) vis[j]=num[i];
  40. }
  41.  
  42. for(i=1;i<=n;i++) printf("%d%c",vis[i],i==n?'\n':' ');
  43. }
  44. return 0;
  45. }

关键的细节问题是:每一个灯最多被关一次。意味着假设曾经訪问过这个点,那么之后不管大小关系,都不会理它了





G.数学题。意思是说求(1+n)*n/2这个数列之中。告诉你n,有多少个数被3整除。

看到那么大的n心里就不要慌啊,肯定是有规律的啊。肯定是不能打表的啊,肯定是小数据猜过程猜结论的啊

或者写出这个数列:1 3 6 10 15 21 28 36 45 55 66 78……

看到规律了吗?每三个数一组,每组的第一个不是3的倍数,第二个和第三个是3的倍数。程序大家自己写吧



H.DP。我最高兴的是这道题我的思路跟bin神是一样的啊,说明有些题是能够做的啊,不要自己吓自己的,比方BC33的第3题。我看着是状态压缩。。赛后理解就是个复杂一点的背包。。(扯远了。。)

定义:dp[i][j][k]代表第一个手指在i处。第二个手指在j处,当前已经完毕k格走过的最短距离。0<=i<=4,0<=j<=4,1<=k<=n。

依据题中数据,n最大10000。

放心的一次循环解决。

初始值为-1意味着当前情况取不到(非经常见的思路啊,用-1标记不可达,用正数标记最短路),初始情况呢,dp[0][0][0]=0



递推的思路也非常easy:假设新节点没去过(值为-1),去呗。去过的话,取小值呗

代码例如以下:

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <map>
  6. #include <set>
  7. #include <vector>
  8. #include <string>
  9. #include <cstring>
  10. #include <sstream>
  11. #include <queue>
  12. #include <stack>
  13. using namespace std;
  14.  
  15. #define input freopen("input.txt","r",stdin)
  16. #define output freopen("output.txt","w",stdout)
  17. #define For1(i,a,b) for (i=a;i<b;i++)
  18. #define For2(i,a,b) for (i=a;i<=b;i++)
  19. #define Fill(x,a) memset(x,a,sizeof(x))
  20. #define inf 99999999
  21. #define pi 3.1415926535897932384626433832795028841971
  22.  
  23. int dp[10][10][10050];
  24. int t,n;
  25. int num[10050];
  26.  
  27. int main(){
  28. int i,j,k,dis;
  29. scanf("%d",&t);
  30. while(t--){
  31. scanf("%d",&n);
  32. for(i=1;i<=n;i++) scanf("%d",&num[i]);
  33. memset(dp,-1,sizeof(dp));
  34. dp[0][0][0]=0;
  35. for(k=1;k<=n;k++)
  36. for(i=0;i<=4;i++)
  37. for(j=0;j<=4;j++){
  38. if (dp[i][j][k-1]==-1) continue;
  39. dis=abs(i-num[k]);
  40. if (dp[num[k]][j][k]==-1) dp[num[k]][j][k]=dp[i][j][k-1]+dis;
  41. else dp[num[k]][j][k]=min(dp[num[k]][j][k],dp[i][j][k-1]+dis);
  42. dis=abs(j-num[k]);
  43. if (dp[i][num[k]][k]==-1) dp[i][num[k]][k]=dp[i][j][k-1]+dis;
  44. else dp[i][num[k]][k]=min(dp[i][num[k]][k],dp[i][j][k-1]+dis);
  45. }
  46. int ans=100000000;
  47. for(i=0;i<=4;i++)
  48. for(j=0;j<=4;j++)
  49. if (dp[i][j][n]!=-1&&dp[i][j][n]<ans) ans=dp[i][j][n];
  50. printf("%d\n",ans);
  51. }
  52. return 0;
  53. }

再次感谢bin神,axp巨巨,Tonny巨巨和群巨和广大acm爱好者的支持。

GDUT决赛题解的更多相关文章

  1. 2018年蓝桥杯A组C/C++决赛题解

    2018年第九届蓝桥杯A组C/C++决赛题解 点击查看视频题解 点击查看2018年蓝桥杯A组C/C++决赛题目(不含答案) 1:三角形面积 画个图,求三角形面积,可以用外接长方形 - 其他多余区域面积 ...

  2. 2016年蓝桥杯B组C/C++决赛题解

    2016年第七届蓝桥杯B组C/C++决赛题解 2016年蓝桥杯B组C/C++决赛题目(不含答案) 1.一步之遥 枚举解方程,或者套模板解线性方程 #include<bits/stdc++.h&g ...

  3. 2015年蓝桥杯B组C/C++决赛题解

    2015年第六届蓝桥杯B组C/C++决赛题解 点击查看2015年第六届蓝桥杯B组C/C++国赛题目(不含答案)     1.积分之迷 三重循环 枚举A,B,C的值,如果满足两个条件:3个A + 7个B ...

  4. 2018年蓝桥杯B组C/C++决赛题解

    2018年第九届蓝桥杯B组C/C++决赛题解 点击查看2018年蓝桥杯B组C/C++决赛题目(不含答案) 1.换零钞 ok 枚举 设x表示1元钱的个数,y表示2元钱的个数,z表示5元钱的个数 x+21 ...

  5. 2017广东工业大学程序设计竞赛决赛 题解&源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)

    心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起“唱” ...

  6. 2017年蓝桥杯B组C/C++决赛题解

    2017年蓝桥杯B组C/C++决赛题目(不含答案) 1.36进制 ok 求36进制,类比二进制转10进制,36^3 + 36^2 + 36^1 + 36^0 2.磁砖样式 ok dfs搜索 我自己写的 ...

  7. 哈理工软件学院"兆方美迪"杯第六届程序设计大赛【高年级组】--决赛 题解

    比赛链接:http://acm-software.hrbust.edu.cn/contest.php?cid=1082 A.好SB啊真是,还以为lis-数有多少个数不一样. #include < ...

  8. [GDUT 决赛]--GCD,LCM——我是好人(数论)

    Description 众所周知,我是好人!所以不会出太难的题,题意很简单 给你两个数n和m,问你有多少对正整数对最大公约数是n,最小公倍数是m最后友情提供解题代码(我真是太好人了) void sol ...

  9. 第十五届北京师范大学程序设计竞赛现场决赛题解&源码(A.思维,C,模拟,水,坑,E,几何,思维,K,字符串处理)

    #include <bits/stdc++.h> using namespace std; int main() { int T,n,a,b; while(cin>>T) { ...

随机推荐

  1. Iframe跨域嵌入页面自动调整高度的办法

    http://www.a.com/A.html http://www.a.com/B.html http://www.a.com/D.js http://www.c.com/C.html A.html ...

  2. HDU2444(判断是否为二分图,求最大匹配)

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  3. linux系统备份脚本

    前言 之前写过<<linux系统简单备份的脚本>>, 最开始一直用着,后来觉得有必要改进下它,不管是从操作方式上还是脚本的工作方式上.之所以这么看重备份,是因为我经历过磁盘损坏 ...

  4. 【bzoj3289】mato的文件管理

    首先允许离线,一眼莫队…… 然后考虑对于每次移动,这不就是让你求逆序对嘛(QAQ) 考虑怎么移动? 每次在最后添加一个数,比这个数大的数都会与其形成一个逆序对 每次在最后移除一个数,比这个数大的数都会 ...

  5. codevs 线段树练习ⅠⅡⅢ

    1080 线段树练习  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 一行N个方格,开始每个格子里都有 ...

  6. solr 启动过程分析

    http://www.cnblogs.com/likehua/p/4353608.html#top

  7. selenium+python自动化81-html报告优化(饼图+失败重跑+兼容python2&3)【转载】

    优化html报告 为了满足小伙伴的各种变态需求,为了装逼提升逼格,为了让报告更加高大上,测试报告做了以下优化: 测试报告中文显示,优化一些断言失败正文乱码问题 新增错误和失败截图,展示到html报告里 ...

  8. Corosync 配置描述

    NAME corosync.conf - corosync executive configuration file SYNOPSIS /etc/corosync/corosync.conf DESC ...

  9. 如果想从jenkins直接生成docker镜像,并推送到harbor中,最简单的脚本如何实现?

    如果不考虑意外, 第一版最简单的构思如下: #!/usr/bin/env python # -*- coding: utf-8 -*- import getopt, sys import subpro ...

  10. head first (二):观察者模式

    首先推荐一下别人写的,很不错可以参考,http://www.cnblogs.com/li-peng/archive/2013/02/04/2892116.html 1.定义 观察者模式:在对象之间定义 ...