最大值

(max)

Time Limit:1000ms   Memory Limit:128MB

题目描述

LYK有一本书,上面有很多有趣的OI问题。今天LYK看到了这么一道题目:

这里有一个长度为n的正整数数列ai(下标为1~n)。并且有一个参数k。

你需要找两个正整数x,y,使得x+k<=y,并且y+k-1<=n。并且要求a[x]+a[x+1]+…+a[x+k-1]+a[y]+a[y+1]+…+a[y+k-1]最大。

LYK并不会做,于是它把题扔给了你。

输入格式(max.in)

第一行两个数n,k。

第二行n个数,表示ai。

输出格式(max.out)

两个数表示x,y。若有很多种满足要求的答案,输出x最小的值,若x最小仍然还有很多种满足要求的答案,输出y最小的值。

输入样例

5 2

6 1 1 6 2

输出样例

1 4

对于30%的数据n<=100。

对于60%的数据n<=1000

对于100%的数据1<=n<=100000,1<=k<=n/2,1<=ai<=10^9。

  1. /*
  2. 题目就是让求长度为k的两个互不重叠区间的和最大
  3. 枚举两个区间的开头,用前缀和求一下
  4. */
  5. #include<iostream>
  6. #include<cstdio>
  7. #define maxn 100010
  8. using namespace std;
  9. int n,k,a[maxn],x,y;
  10. long long sum[maxn],mx;
  11. int main(){
  12. //freopen("Cola.txt","r",stdin);
  13. freopen("max.in","r",stdin);freopen("max.out","w",stdout);
  14. scanf("%d%d",&n,&k);
  15. for(int i=;i<=n;i++){
  16. scanf("%d",&a[i]);
  17. sum[i]=sum[i-]+a[i];
  18. }
  19. long long sum1,sum2;
  20. for(int s1=;s1<=n-*k+;s1++){
  21. sum1=sum[s1+k-]-sum[s1-];
  22. for(int s2=s1+k;s2<=n-k+;s2++){
  23. sum2=sum[s2+k-]-sum[s2-];
  24. if(sum1+sum2>mx){
  25. mx=sum1+sum2;
  26. x=s1,y=s2;
  27. }
  28. }
  29. }
  30. printf("%d %d",x,y);
  31. fclose(stdin);fclose(stdout);
  32. return ;
  33. }

60分 暴力

  1. /*
  2. b[i]表示左端点在i长度为k的区间这个和是多少
  3. 找一个x,找一个y,使得x+k<=y,并且y+k-1<=n 并且b[x]+b[y]最大
  4.  
  5. 当固定x的时候, x+k<=y<=n-k+1 区间求最大 -> 线段树/倍增表 nlgn
  6. 当x从大变小的时候, y解锁了一个位置 拿这个数来更新b[y]的最大值 O(n)
  7. */
  8. #include <cmath>
  9. #include <cstdio>
  10. #include <cstdlib>
  11. #include <iostream>
  12. #include <algorithm>
  13. using namespace std;
  14. int n,m,a[],i,ansx,ansy;
  15. long long sum[],MAX,MAX1[],MAX2[],x2[],x1[];
  16. int main()
  17. {
  18. freopen("max.in","r",stdin);
  19. freopen("max.out","w",stdout);
  20. scanf("%d%d",&n,&m);
  21. for (i=; i<=n; i++) scanf("%d",&a[i]);
  22. for (i=; i<=n; i++)
  23. sum[i]=sum[i-]+(long long)a[i];
  24. // return 0;
  25. for (i=m; i<=n; i++)
  26. {
  27. //if (i%1000==0)cout<<i<<endl;
  28. if (MAX1[i-]>=sum[i]-sum[i-m])
  29. {
  30. x1[i]=x1[i-];
  31. MAX1[i]=MAX1[i-];
  32. }
  33. else
  34. {
  35. x1[i]=i-m+;
  36. MAX1[i]=sum[i]-sum[i-m];
  37. }
  38. }
  39. for (i=n-m+; i>=; i--)
  40. {
  41. if (MAX2[i+]>sum[i+m-]-sum[i-])
  42. {
  43. x2[i]=x2[i+];
  44. MAX2[i]=MAX2[i+];
  45. }
  46. else
  47. {
  48. x2[i]=i;
  49. MAX2[i]=sum[i+m-]-sum[i-];
  50. }
  51. }
  52. for (i=m; i<=n-m; i++)
  53. {
  54. if (MAX1[i]+MAX2[i+]>MAX)
  55. {
  56. MAX=MAX1[i]+MAX2[i+];
  57. ansx=x1[i]; ansy=x2[i+];
  58. }
  59. }
  60. printf("%d %d\n",ansx,ansy);
  61. return ;
  62. }

100分 前缀和+线段树/倍增表

吃东西

(eat)

Time Limit:2000ms   Memory Limit:1024MB

题目描述

一个神秘的村庄里有4家美食店。这四家店分别有A,B,C,D种不同的美食。LYK想在每一家店都吃其中一种美食。每种美食需要吃的时间可能是不一样的。

现在给定第1家店A种不同的美食所需要吃的时间a1,a2,…,aA。

给定第2家店B种不同的美食所需要吃的时间b1,b2,…,bB。

以及c和d。

LYK拥有n个时间,问它有几种吃的方案。

输入格式(eat.in)

第一行5个数分别表示n,A,B,C,D。

第二行A个数分别表示ai。

第三行B个数分别表示bi。

第四行C个数分别表示ci。

第五行D个数分别表示di。

输出格式(eat.out)

一个数表示答案。

输入样例

11 3 1 1 1

4 5 6

3

2

1

输出样例

2

对于30%的数据A,B,C,D<=50

对于另外30%的数据n<=1000。

对于100%的数据1<=n<=100000000,1<=A,B,C,D<=5000,0<=ai,bi,ci,di<=100000000。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<ctime>
  4. #include<algorithm>
  5. #define maxn 5010
  6. using namespace std;
  7. int n,A,B,C,D,a[maxn],b[maxn],c[maxn],d[maxn],cnt;
  8. long long v[],ans;
  9. int find(int x){
  10. int l=,r=cnt,res=;
  11. while(l<=r){
  12. int mid=(l+r)>>;
  13. if(v[mid]<=x)res=mid,l=mid+;
  14. else r=mid-;
  15. }
  16. return res;
  17. }
  18. int main(){
  19. //freopen("data.txt","r",stdin);
  20. freopen("eat.in","r",stdin);freopen("eat.out","w",stdout);
  21. scanf("%d%d%d%d%d",&n,&A,&B,&C,&D);
  22. for(int i=;i<=A;i++)scanf("%d",&a[i]);
  23. for(int i=;i<=B;i++)scanf("%d",&b[i]);
  24. for(int i=;i<=C;i++)scanf("%d",&c[i]);
  25. for(int i=;i<=D;i++)scanf("%d",&d[i]);
  26. sort(a+,a+A+);sort(b+,b+B+);
  27. sort(c+,c+C+);sort(d+,d+D+);
  28. if(a[A]+b[B]+c[C]+d[D]<=n){
  29. ans=1LL*A*B*C*D;
  30. cout<<ans;
  31. return ;
  32. }
  33. for(int i=;i<=A;i++){
  34. if(a[i]>n)break;
  35. for(int j=;j<=B;j++){
  36. if(a[i]+b[j]>n)break;
  37. v[++cnt]=a[i]+b[j];
  38. }
  39. }
  40. sort(v+,v+cnt+);
  41. for(int i=;i<=C;i++){
  42. if(c[i]>n)break;
  43. for(int j=;j<=D;j++){
  44. if(c[i]+d[j]>n)break;
  45. int pos=find(n-c[i]-d[j]);//小于等于某数的最后一个位置
  46. ans+=pos;
  47. }
  48. }
  49. cout<<ans;
  50. fclose(stdin);fclose(stdout);
  51. return ;
  52. }

70分 折半枚举

  1. /*
  2. 1024MB*1024*1024/4 = 225000000个int数组
  3. A和B C和D
  4. A和B和C和D
  5.  
  6. A和B中的一种 C和D的一种
  7. A和B 双重循环 来得到一个f[i]表示花了i这个时间有几种可能 A*B
  8. 进行桶排序,把f按次序的放进x数组中,A*B种可能排个序
  9. C和D 双重循环 来得到一个g[i]表示花了i这个时间有几种可能 C*D
  10. 进行桶排序,把g按次序的放进y数组中,C*D种可能排个序
  11. A*B 一个数组x C*D的一个数组y 查询存在多少对i,j,使得x[i]+y[j]<=n (x和y都是有序的)
  12. x和y都是顺序的。
  13.  
  14. x[1] y[?] 一个前缀(1~p)
  15. x[2] y[??] 一个前缀(1~pp) pp<=p
  16. x[3] y[???] 一个前缀(1~ppp) ppp<=pp
  17.  
  18. 当一个规模解决不了的时候,分成两半 meet in the middle
  19.  
  20. */
  21. #include <cmath>
  22. #include <cstdio>
  23. #include <cstdlib>
  24. #include <iostream>
  25. #include <algorithm>
  26. #include <string>
  27. #include <cstring>
  28. using namespace std;
  29. int f[],c[],cc[];
  30. int A,B,C,D,n,a[],b[],aa[],bb[],MAX,cnt,cntt,i,j,now;
  31. long long ans;
  32. int main()
  33. {
  34. freopen("eat.in","r",stdin);
  35. freopen("eat.out","w",stdout);
  36. scanf("%d%d%d%d%d",&n,&A,&B,&C,&D);
  37. if (n== && A== && B== && C== && D==) return ;
  38. for (i=; i<=A; i++) scanf("%d",&a[i]);
  39. for (i=; i<=B; i++) scanf("%d",&b[i]);
  40. MAX=;
  41. cnt=cntt=;
  42. for (i=; i<=A; i++)
  43. for (j=; j<=B; j++)
  44. if (a[i]+b[j]<=n)
  45. {
  46. f[a[i]+b[j]]++;
  47. MAX=max(MAX,a[i]+b[j]);
  48. }
  49. for (i=; i<=MAX; i++)
  50. while (f[i])
  51. {
  52. f[i]--;
  53. c[++cnt]=i;
  54. }
  55.  
  56. for (i=; i<=C; i++) scanf("%d",&aa[i]);
  57. for (i=; i<=D; i++) scanf("%d",&bb[i]);
  58. MAX=;
  59. for (i=; i<=C; i++)
  60. for (j=; j<=D; j++)
  61. if (aa[i]+bb[j]<=n)
  62. {
  63. f[aa[i]+bb[j]]++;
  64. MAX=max(MAX,aa[i]+bb[j]);
  65. }
  66. for (i=; i<=MAX; i++)
  67. while (f[i])
  68. {
  69. f[i]--;
  70. cc[++cntt]=i;
  71. }
  72. for (i=cntt; i>=; i--) if (c[]+cc[i]<=n) break;
  73. now=i;
  74. for (i=; i<=cnt; i++)
  75. {
  76. ans+=now;
  77. while (now&& c[i+]+cc[now]>n) now--;
  78. }
  79. cout<<ans<<endl;
  80. ans=;
  81. return ;
  82. }

100分 meet in the middle

分糖果

(candy)

Time Limit:1000ms   Memory Limit:128MB

题目描述

总共有n颗糖果,有3个小朋友分别叫做L,Y,K。每个小朋友想拿到至少k颗糖果,但这三个小朋友有一个共同的特点:对3反感。也就是说,如果某个小朋友拿到3颗,13颗,31颗,333颗这样数量的糖果,他就会不开心。(也即它拿到的糖果数量不包含有一位是3)

LYK掌管着这n颗糖果,它想问你有多少种合理的分配方案使得将这n颗糖果全部分给小朋友且没有小朋友不开心。

例如当n=3,k=1时只有1种分配方案,当n=4,k=1时有3种分配方案分别是112,121,211。当n=7,k=2时则不存在任何一种合法的方案。

当然这个答案可能会很大,你只需输出答案对12345647取模后的结果就可以了。

输入格式(candy.in)

第一行两个数表示n,k。

输出格式(candy.out)

一个数表示方案总数。

输入样例

99999 1

输出样例

9521331

对于30%的数据n<=100

对于50%的数据n<=1000。

对于另外30%的数据k=1。

对于100%的数据3<=n<=10^10000,1<=k<=n/3,且n,k不包含前导0。

  1. #include<iostream>
  2. #include<cstdio>
  3. #define mod 12345647
  4. using namespace std;
  5. int n,k,ans;
  6. bool check(int x){
  7. while(x){
  8. if(x%==)return ;
  9. x/=;
  10. }
  11. return ;
  12. }
  13. int main(){
  14. freopen("candy.in","r",stdin);freopen("candy.out","w",stdout);
  15. scanf("%d%d",&n,&k);
  16. for(int i=k;i<=n-k-k;i++){
  17. for(int j=k;i+j<=n-k;j++){
  18. int k=n-i-j;
  19. if(check(i)&&check(j)&&check(k))ans++;
  20. if(ans>=mod)ans-=mod;
  21. }
  22. }
  23. cout<<ans;
  24. fclose(stdin);fclose(stdout);
  25. return ;
  26. }

50分 暴力

  1. /*
  2. 枚举两个数,第三个数是确定,判断一下。
  3.  
  4. f[i]表示i这个数字是否有3
  5.  
  6. dp[i][j][0/1][0/1][0/1]来表示当前从高到低第i位,并且这一位需要向它的高位进j位 j=[0,2] 这3个数分别是否超过了k
  7.  
  8. for (i=1; i<=|a|; i++)
  9. for (j=0; j<=2; j++)
  10. for (u=0; u<=1; u++)
  11. for (v=0; v<=1; v++)
  12. for (w=0; w<=1; w++)
  13. for (x=0; x<=9; x++)
  14. for (y=0; y<=9; y++)
  15. for (z=0; z<=9; z++)
  16. if (x+y+z>=10*j && x!=3 && y!=3 && z!=3)
  17. {
  18. int k=x+y+z-10*j;
  19. if (k==a[i]) {dp[i+1][0][][][]+=dp[i][j];}
  20. if (k==a[i]-1) {dp[i+1][1][][][]+=dp[i][j];}
  21. if (k==a[i]-2) {dp[i+1][2][][][]+=dp[i][j];}
  22. }
  23. n=|a|
  24. cout<<dp[n][0];
  25. */
  26. #include <cmath>
  27. #include <cstdio>
  28. #include <cstdlib>
  29. #include <iostream>
  30. #include <algorithm>
  31. #include <string>
  32. #include <cstring>
  33. using namespace std;
  34. const int MOD=;
  35. int dp[][][][][],a[],b[],len1,len2,i,j,k,l,t,I,J,K,L,T,s1,s2,s3,ans;
  36. char n[],LL[];
  37. void ADD(int &A,int B) {A+=B; if (A>=MOD) A-=MOD;}
  38. int main()
  39. {
  40. freopen("candy.in","r",stdin);
  41. freopen("candy.out","w",stdout);
  42. scanf("%s",n);
  43. scanf("%s",LL);
  44. len1=strlen(n); len2=strlen(LL);
  45. for (i=; i<len1; i++) a[i+]=n[i]-'';
  46. for (i=; i<len1; i++) b[i+]=;
  47. for (i=; i<len2; i++) b[+i+len1-len2]=LL[i]-'';
  48. for (i=; i<=len1; i++)
  49. for (j=; j<=; j++)
  50. for (k=; k<=; k++)
  51. for (l=; l<=; l++)
  52. for (t=; t<=; t++) dp[i][j][k][l][t]=;
  53. dp[][][][][]=;
  54. for (i=; i<len1; i++)
  55. for (j=; j<=; j++)
  56. for (k=; k<=; k++)
  57. for (l=; l<=; l++)
  58. for (t=; t<=; t++)
  59. if (dp[i][j][k][l][t])
  60. {
  61. for (s1=; s1<=; s1++)
  62. if (s1!=)
  63. for (s2=; s2<=; s2++)
  64. if (s2!=)
  65. for (s3=; s3<=; s3++)
  66. if (s3!=)
  67. {
  68. I=i+;
  69. J=j*+a[i+]-s1-s2-s3;
  70. if (J> || J<) continue;
  71. if (k== && s1<b[i+]) continue;
  72. K=(k || s1>b[i+]);
  73. if (l== && s2<b[i+]) continue;
  74. L=(l || s2>b[i+]);
  75. if (t== && s3<b[i+]) continue;
  76. T=(t || s3>b[i+]);
  77. ADD(dp[I][J][K][L][T],dp[i][j][k][l][t]);
  78. }
  79. }
  80. for (k=; k<=; k++) for (l=; l<=; l++) for (t=; t<=; t++) ADD(ans,dp[len1][][k][l][t]);
  81. cout<<ans<<endl; ans=;
  82. return ;
  83. }

100分 数位dp

2017-10-2 清北刷题冲刺班p.m的更多相关文章

  1. 2017-10-4 清北刷题冲刺班p.m

    P102zhx a [问题描述]你是能看到第一题的 friends 呢.——hja两种操作:1.加入一个数.2.询问有多少个数是?的倍数.[输入格式]第一行一个整数?,代表操作数量.接下来?行,每行两 ...

  2. 2017-10-4 清北刷题冲刺班a.m

    P101zhx a [问题描述]你是能看到第一题的 friends 呢.——hjaHja 拥有一套时光穿梭技术,能把字符串以超越光速的速度传播,但是唯一的问题是可能会 GG.在传输的过程中,可能有四种 ...

  3. 2017-10-3 清北刷题冲刺班p.m

    a [问题描述]你是能看到第一题的 friends 呢.——hja给你一个只有小括号和中括号和大括号的括号序列,问该序列是否合法.[输入格式]一行一个括号序列.[输出格式]如果合法,输出 OK,否则输 ...

  4. 2017-10-3 清北刷题冲刺班a.m

    P99zhx a [问题描述]你是能看到第一题的 friends 呢.——hja怎么快速记单词呢?也许把单词分类再记单词是个不错的选择.何大爷给出了一种分单词的方法,何大爷认为两个单词是同一类的当这两 ...

  5. 2017-10-2 清北刷题冲刺班a.m

    一道图论神题 (god) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只 ...

  6. 2017-10-1 清北刷题冲刺班p.m

    一道图论好题 (graph) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图 ...

  7. 2017-10-7 清北刷题冲刺班p.m

    测试 A 同花顺 文件名 输入文件 输出文件 时间限制 空间限制card.cpp/c/pas card.in card.out 1s 512MB题目描述所谓同花顺,就是指一些扑克牌,它们花色相同,并且 ...

  8. 2017-10-7 清北刷题冲刺班a.m

    测试 A 消失的数字 文件名 输入文件 输出文件 时间限制 空间限制del.cpp/c/pas del.in del.out 1s 512MB题目描述现在,我的手上有 n 个数字,分别是 a 1 ,a ...

  9. 2017-10-1 清北刷题冲刺班a.m

    位运算1 (bit) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥 ...

随机推荐

  1. priority_queue用法(转载)

    关于priority_queue 1,关于STL中的priority_queue:确定用top()查看顶部元素时,该元素是具有最高优先级的一个元素. 调用pop()删除之后,将促使下一个元素进入该位置 ...

  2. Idea_学习_05_Intellij Idea自动添加注释的方法

    二.参考资料 1. Intellij Idea自动添加注释的方法

  3. chrome浏览器的跨域设置-包括版本49前后两种设置 ,windows&mac

    做前后分离的webapp开发的时候,出于一些原因往往需要将浏览器设置成支持跨域的模式,好在chrome浏览器就是支持可跨域的设置,网上也有很多chrome跨域设置教程.但是新版本的chrome浏览器提 ...

  4. web网页打印的方法(浏览器通用)

    Web打印组件jatoolsPrinter 应用web化,不论对开发商,还是对用户来说,实在是一种很经济的选择,因为基于 web的应用,客户端的规则很简单,容易学习,容易维护,容易发布.但对程序员来说 ...

  5. 8个Javascript小技巧,让你写的代码有腔调

    如果你想确保你的JavaScript在大多数浏览器和移动设备中都可以工作,那么我从大漠等大神指导,原来可以使用f2etest,也可以使用Endtest,browserstack等 1. 使用 + 字符 ...

  6. 七牛 python

    Python SDK使用指南 上传策略 变量 对象存储 API 参考手册 多媒体数据处理 API 参考手册

  7. BZOJ3401:[USACO2009MAR]Look Up

    浅谈栈:https://www.cnblogs.com/AKMer/p/10278222.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...

  8. jquery给select赋值

    项目中用到通过ajax请求数据然后给select赋值,由于经常遇到类似的代码,在这里把整个过程记录一下. 首选发出ajax请求如下: <script type="text/javasc ...

  9. HDU1257(简单DP)

    最少拦截系统 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  10. 手把手教你写Kconfig---基于tiny4412开发板

    转自:http://blog.csdn.net/morixinguan/article/details/54744237 今天,我就来教大家写写最简单的Kconfig,什么是Kconfig? 我们配置 ...