不要问我为什么昨天考的今天才贴解题报告。。

第一题:

  给定3个字符串,求它们的最长公共子序列。

解:

  考试时知道肯定是LCS的二维再加一维,用三维,可天堂有路你不走,地狱无门你偏来。。。灵机一动想出来一个方法:先记下前两个的最长公共子序列(可能有多个),然后再一一与第三个字符串比较,找出三者的最长公共子序列。然后就GG了。想不通,思路应该是对的啊。所以又留了一道题来想。

  然后三维的状态转移很好写。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<map>
  6. #define maxn 125
  7. using namespace std;
  8. char a[maxn],b[maxn],c[maxn];
  9. int n,f[maxn][maxn][maxn];
  10. int main()
  11. {
  12. freopen("subq.in","r",stdin);
  13. freopen("subq.out","w",stdout);
  14. cin>>n;
  15. scanf("%s%s%s",a+,b+,c+);
  16. for (int i=;i<=n;i++)
  17. for (int j=;j<=n;j++)
  18. for (int k=;k<=n;k++)
  19. {
  20. f[i][j][k]=max(f[i-][j][k],max(f[i][j-][k],f[i][j][k-]));
  21. if (a[i]==b[j]&&b[j]==c[k])
  22. f[i][j][k]=f[i-][j-][k-]+;
  23. }
  24. cout<<f[n][n][n];
  25. return ;
  26. }

不要后悔。。。


第二题:

  定义两个素数是连续的当且仅当这两个素数之间不存在其他的素数(如 7,11 ,(23,29)。给定N,K,在不超过N的正整数中求能够分解为K个连续的素数的和的最大的那个是多少。

解:

  先开始连题都读错了,想着完了我肯定不会,这是唯一分解定理啊,数论没看过啊。然后再定睛几看,额,只是一个和而已好吗。下次要先把题读清楚。

  然后就是先求出10^6以内的素数,然后 前缀和+二分答案。哦,因为一个二分模板的问题,哎。贴一个二分模板:

  1. int l= , r=n+;
  2. while(l<r) // the minimum line above P(x0,y0)
  3. {
  4. int m = (l+r)>>;
  5. if(check(m)) r = m;//在下面;
  6. else l = m + ;
  7. }
  8. return l-;

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define maxn 1000005
  6. #define ll long long
  7. using namespace std;
  8. int t,n[],k[],ma,su[maxn],idx;
  9. ll he[maxn];
  10. bool zhi[maxn];
  11. void get_zhi(int x)
  12. {
  13. memset(zhi,true,sizeof(zhi));
  14. for (int i=;i*i<=x;i++)
  15. if (zhi[i]){
  16. for(int j=i*i;j<=x;j+=i)
  17. if (zhi[j]){
  18. zhi[j]=false;
  19. }
  20. }
  21. zhi[]=false;
  22. for (int i=;i<=x;i++)
  23. if (zhi[i]) {
  24. //su[++idx]=i;
  25. ++idx;
  26. he[idx]=(ll)he[idx-]+i;
  27. }
  28. }
  29. void work(int x,int y)
  30. {
  31. int l=y,r=idx;//l
  32. ll ans=-;
  33. while (l<=r){
  34. int mid=(l+r)>>;
  35. ll an=he[mid]-he[max(,mid-y)];
  36. if (an<=x){l=mid+;ans=an;}
  37. else r=mid-;
  38. }
  39. printf("%I64d\n",ans);
  40. /*if (he[l]-he[l-y]>x) {
  41. l--;ans=he[l]-he[l-y];
  42. }
  43. //if (l+1>y&&he[l]-he[l-y]>x)
  44. else if (ans!=-1&&he[l]-he[l-y]>x&&l-1<=y) ans=-1;
  45. if (l-y<0) ans=-1;*/
  46. //l+=1;
  47. /*for (int i=l;i>=y;i--)//****
  48. {
  49. if (i>idx) continue;
  50. if (he[i]-he[i-y]<=1) {//****
  51. printf("-1\n");
  52. return ;
  53. }
  54. else if (he[i]-he[i-y]<=x) {
  55. printf("%I64d\n",he[i]-he[i-y]);
  56. return ;
  57. }
  58. }
  59. printf("-1\n");*/
  60. }
  61. int main()
  62. {
  63. freopen("dun.in","r",stdin);
  64. freopen("dun.out","w",stdout);
  65. cin>>t;
  66. for (int i=;i<=t;i++)
  67. {
  68. scanf("%d%d",&n[i],&k[i]);
  69. if (n[i]>ma) ma=n[i];
  70. }
  71. get_zhi(ma);
  72. for (int i=;i<=t;i++)
  73. work(n[i],k[i]);
  74. return ;
  75. }

第三题

  有一个村庄在闹饥荒,善良而土豪的YGH决定给他们发放救济粮,该村庄有 n 户人家,每两户人家之间只有一条路可以互相到达,即这些人家之间形成一棵树。现在 YGH 会以这样的形式给他们发放粮食,选择两户人家,然后对这两个户人家路径上的所有人家都发放一袋种类为 w 的救济粮。在完成一系列发放任务后,YGH 想知道每一户人家收到的粮食中数量最多的是哪一种。

解:

  40%:暴力。注意dfs的返回如果没有加判断,那么idx一直往下减就会下标超界。。然后就不知道哪里的值会被改了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define maxn 1005
  6. using namespace std;
  7. int n,q,road[maxn],idx;
  8. int tot,he[maxn],ne[maxn*],to[maxn*];
  9. bool vis[maxn],can=false;
  10. struct pp{
  11. int sum;
  12. int w[maxn],num[maxn];
  13. };
  14. pp house[maxn];
  15. void add(int a,int b)
  16. {
  17. tot++;to[tot]=b;ne[tot]=he[a];he[a]=tot;
  18. }
  19. void update(int x,int y,int ad)
  20. {
  21. road[++idx]=x;
  22. vis[x]=true;
  23. if (x==y){
  24. while (idx)
  25. {
  26. int s=road[idx];
  27. bool yes=false;
  28. for (int i=;i<=house[s].sum;i++)
  29. if (house[s].w[i]==ad){
  30. house[s].num[i]++;
  31. yes=true;
  32. break;
  33. }
  34. if(!yes){
  35. house[s].sum++;
  36. house[s].w[house[s].sum]=ad;
  37. house[s].num[house[s].sum]++;
  38. }
  39. idx--;
  40. }
  41. can=true;
  42. return ;
  43. }
  44. for (int i=he[x];i;i=ne[i])
  45. if (!vis[to[i]]){
  46. vis[to[i]]=true;
  47. update(to[i],y,ad);
  48. if (can) return ;//回溯不加判断会下标超界
  49. vis[to[i]]=false;
  50. idx--;
  51. }
  52. }
  53. int main()
  54. {
  55. freopen("rice.in","r",stdin);
  56. freopen("rice.out","w",stdout);
  57. cin>>n>>q;
  58. for (int i=;i<n;i++)
  59. {
  60. int x,y;
  61. scanf("%d%d",&x,&y);
  62. add(x,y);
  63. add(y,x);
  64. }
  65. for (int i=;i<=q;i++)
  66. {
  67. int x,y,z;idx=;can=false;
  68. memset(road,,sizeof(road));
  69. memset(vis,,sizeof(vis));
  70. scanf("%d%d%d",&x,&y,&z);
  71. update(x,y,z);
  72. }
  73. for (int i=;i<=n;i++)
  74. {
  75. int mx=,cur=;
  76. for (int j=;j<=house[i].sum;j++)
  77. {
  78. if (house[i].num[j]>mx)
  79. mx=house[i].num[j];
  80. }
  81. for (int j=;j<=house[i].sum;j++)
  82. if (house[i].num[j]==mx) {
  83. if (house[i].w[j]<cur) cur=house[i].w[j];
  84. }
  85. if (cur==) cout<<""<<endl;
  86. else printf("%d\n",cur);
  87. }
  88. return ;
  89. }
  90. //30 min

  100%:树剖。先挖坑。

【61测试】【dp】【二分】【前缀和】【树剖】的更多相关文章

  1. BZOJ 4712 洪水 (线段树+树剖动态维护DP)

    题目大意:略 题目传送门 数据结构好题,但据说直接上动态DP会容易处理不少,然而蒟蒻不会.一氧化碳大爷说还有一个$log$的做法,然而我只会$log^{2}$的.. 考虑静态时如何处理,设$f[x]$ ...

  2. 洛谷P4332 [SHOI2014]三叉神经树(LCT,树剖,二分查找,拓扑排序)

    洛谷题目传送门 你谷无题解于是来补一发 随便百度题解,发现了不少诸如树剖\(log^3\)LCT\(log^2\)的可怕描述...... 于是来想想怎么利用题目的性质,把复杂度降下来. 首先,每个点的 ...

  3. 【BZOJ5210】最大连通子块和 树剖线段树+动态DP

    [BZOJ5210]最大连通子块和 Description 给出一棵n个点.以1为根的有根树,点有点权.要求支持如下两种操作: M x y:将点x的点权改为y: Q x:求以x为根的子树的最大连通子块 ...

  4. [CTSC2008]网络管理(整体二分+树剖+树状数组)

    一道经典的带修改树链第 \(k\) 大的问题. 我只想出三个 \(\log\) 的解法... 整体二分+树剖+树状数组. 那不是暴力随便踩的吗??? 不过跑得挺快的. \(Code\ Below:\) ...

  5. [bzoj4712]洪水 线段树+树链剖分维护动态dp+二分

    Description 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开了创造模式,然后飞到山顶放了格水.于是小A面前出现了一个瀑布.作为平民的小A只好老实巴交地爬 ...

  6. 51nod1307(暴力树剖/二分&dfs/并查集)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307 题意: 中文题诶~ 思路: 解法1:暴力树剖 用一个数 ...

  7. 洛谷P4719 动态DP —— 动态DP(树剖+矩乘)

    题目:https://www.luogu.org/problemnew/show/P4719 感觉这篇博客写得挺好:https://blog.csdn.net/litble/article/detai ...

  8. 洛谷P3250 [HNOI2016]网络(整体二分+树状数组+树剖)

    传送门 据说正解是树剖套堆???然而代码看着稍微有那么一点点长…… 考虑一下整体二分,设当前二分到的答案为$mid$,如果所有大于$mid$的边都经过当前点$x$,那么此时$x$的答案必定小于等于$m ...

  9. bzoj2402 陶陶的难题II 分数规划+树剖+线段树维护凸壳+二分

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2402 题解 看上去很像分数规划的模型.于是就二分吧.令 \[ \begin{align*}\f ...

随机推荐

  1. Coursera台大机器学习课程笔记3 – 机器学习的可能性

    提纲: 机器学习为什么可能? 引入计算橙球概率问题 通过用Hoeffding's inequality解决上面的问题,并得出PAC的概念,证明采样数据学习到的h的错误率可以和全局一致是PAC的 将得到 ...

  2. 安卓开发经验分享:资源、UI、函数库、测试、构建一个都不能少(转)

    除了高超的武艺,每位黑忍者还需要装备最好的武器.在软件开发的世界里,好的工具能让我们的生活变得更轻松,在更短的时间里写出更棒的代码. 时光回到2008年,那时安卓还很年轻.只有几个相关的博客和谷歌官方 ...

  3. 数据库连接driverClass和jdbcUrl大全

    一.MySQL: driverClass:com.mysql.jdbc.Driver                         org.gjt.mm.mysql.Driver jdbcUrl:j ...

  4. spring事物配置,声明式事务管理和基于@Transactional注解的使用

    http://blog.csdn.net/bao19901210/article/details/41724355 http://www.cnblogs.com/leiOOlei/p/3725911. ...

  5. Team Queue (uva540 队列模拟)

    Team Queue Queues and Priority Queues are data structures which are known to most computer scientist ...

  6. Fiddler—PC上实现手机的抓包

    PC上安装Fiddler之后,可以抓取各种浏览器的请求,通过一些设置可以获取iPhone.安卓手机.windows phone的请求.具体的工作原理我也不多说(哼,绝对不是因为我不懂XD),主要说下如 ...

  7. 十五、JDBC操作数据库

    1.数据库特点 实现数据共享.减少数据的冗余度.数据的独立性.数据集中控制.数据的一致性和可维护性. 2.数据库种类和功能 (1)层次型数据库:类似于树结构,是一组通过链接而互相联系在一起的记录. ( ...

  8. 我的android学习经历40

    为listview设置背景,并且不随拖动改变 <ListView android:id="@+id/list_view" android:layout_width=" ...

  9. Calendar日历小程序

    //有待完善,有点bugpackage com.sunshine.framework.calendar.model;import java.util.Calendar;/** * * <p> ...

  10. [转](四)unity4.6Ugui中文教程文档-------概要-UGUI Visual Components

    转自孙广东.   转载请注明出处:http://write.blog.csdn.net/postedit/38922399 更全的内容请看我的游戏蛮牛地址:http://www.unitymanual ...