最大值(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。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 100010
#define LL long long
using namespace std;
int n,k,x,y;
long long q,sum[N];
int read()
{
    ,f=;char ch=getchar();
    ;ch=getchar();}
    +ch-',ch=getchar();
    return x*f;
}
int main()
{
    freopen("max.in","r",stdin);
    freopen("max.out","w",stdout);
    n=read(),k=read();
    ;i<=n;i++) x=read(),sum[i]=sum[i-]+(LL)x;
    for(int i=k;i<=n;i++)
      if(q<sum[i]-sum[i-k])
      {
          ) x=y;
        y=i-k+,q=sum[i]-sum[i-k];
      }
    printf("%d %d",x,y);
    ;
}

20分、、、、(代码出了点小问题)

这个题说白了就是让着找最大的k个数的前缀和的位置跟次大的k个数的前缀和的位置,在找这个次大的位置的时候,一定不要忘记x+k<y即我们设最大的数的位置为x,现在我们找到的位置为i,那么这两个位置一定要满足:abs(x-i)>=k,注意我们这个地方找的是次大的,一定不要在找的时候找了两遍最大的

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 100010
#define LL long long
using namespace std;
int n,k,x,y,a[N];
long long q,sum[N];
int read()
{
    ,f=; char ch=getchar();
    ;ch=getchar();}
    +ch-',ch=getchar();
    return x*f;
}
int main()
{
    freopen("max.in","r",stdin);
    freopen("max.out","w",stdout);
    n=read(),k=read();
    ;i<=n;i++)
    {
        a[i]=read();
        ]+(LL)a[i];
        ]+(LL)a[i]-(LL)a[i-k];
    }
    for(int i=k;i<=n;i++)
     if(q<sum[i]) q=sum[i],x=i;
    q=;
    for(int i=k;i<=n;i++)
     if(i!=x&&q<sum[i]&&abs(i-x)>=k)
       q=sum[i],y=i;
    if(x>y) swap(x,y);
    x=x-k+,y=y-k+;
    printf("%d %d",x,y);
    ;
}

AC代码

吃东西(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。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 10000
using namespace std;
],q[][N];
int read()
{
    ,f=; char ch=getchar();
    ;ch=getchar();}
    +ch-',ch=getchar();
    return x*f;
}
void dfs(int s,int t)
{
    ) return ;
    +)
    {
        ans++;
        return ;
    }
    ;i<=sum[s];i++)
     dfs(s+,t-q[s][i]);
}
int main()
{
    freopen("eat.in","r",stdin);
    freopen("eat.out","w",stdout);
    t=read();
    ;i<=;i++) sum[i]=read();
    ;i<=;i++)
     ;j<=sum[i];j++)
       q[i][j]=read();
    dfs(,t);
    printf("%d",ans);
    ;
}

30分的暴力搜索

我们将4家店分成两部分,第一部分为只在A和B吃一样东西耗费的时间,另一部分为在C和D吃一样东西耗费的时间,然后我们先预处理出第一部分耗费的时间来,然后求一个前缀和(为什么要求前缀和??因为我们最终耗费的时间是在n以内,也就是小于等于n的方案数,如果不计前缀和当前的恰好为正好耗费这个时间的方案数,而这个数组前面的恰好为小于这个时间的方案数,所以我们要处理一个前缀和),然后我们再来枚举吃C和D的哪个美食,然后在累加这种情况下加上A和B以后有多少中情况满足条件,最后输出答案

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 5010
#define LL long long
using namespace std;
long long ans;
];
int read()
{
    ,f=; char ch=getchar();
    ;ch=getchar();}
    +ch-',ch=getchar();
    return x*f;
 }
 int main()
 {
     freopen("eat.in","r",stdin);
     freopen("eat.out","w",stdout);
     ;
    n=read(),A=read(),B=read(),C=read(),D=read();
     ;i<=A;i++) a[i]=read();
     ;i<=B;i++) b[i]=read();
    ;i<=C;i++) c[i]=read();
    ;i<=D;i++) d[i]=read();
    ;i<=A;i++)
     ;j<=B;j++)
     {
         sum[a[i]+b[j]]++;
         minn=min(a[i]+b[j],minn);
         maxn=max(a[i]+b[j],maxn);
      }
    ];
    ;i<=C;i++)
     ;j<=D;j++)
      if(n-c[i]-d[j]>=minn) ans+=(LL)sum[min(n-c[i]-d[j],maxn)];
    printf("%I64d",ans);
     ;
 }

AC代码

发现原来这种可以分成好几部分来做的题可以先分成好几部分与处理一下在做

分糖果(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。

/*
一共三个数组成n,我们枚举前两个数,第三个数就可以直接算出来,然后判断这三个数是否满足条件,如果满足条件,ans++
我们用一个pd函数判断这个数是否满足条件,满足条件的情况为每一位上都不含有3
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
LL n,k,ans;
LL read()
{
    LL x=,f=; char ch=getchar();
    ;ch=getchar();}
    +ch-',ch=getchar();
    return x*f;
}
bool pd(LL x)
{
    while(x)
    {
        ==) return true;
        x/=;
    }
    return false;
}
int main()
{
    freopen("candy.in","r",stdin);
    freopen("candy.out","w",stdout);
    n=read(),k=read();
    for(int i=k;i<=n-k;i++)
    {
        if(pd(i)) continue;
        for(int j=k;j+i<=n-k;j++)
         if(pd(j)||pd(n-i-j)) continue;
         else ans++;
    }
    printf("%lld",ans);
    ;
}

50分的枚举

正解:数位dp(本人暂时不想搞dp(主要是脑子笨想不出状态转移来),一段时间后在改吧)

#include<cstdio>
#include<cstring>
#define N 10003
using namespace std;
;
char s[N];
][][][];
void ADD(int &i,int j)  {  i+=j; if(i>=mod) i-=mod; }
int main()
{
    freopen("candy.in","r",stdin);
    freopen("candy.out","w",stdout);
    scanf(); );
    ;i<=len1;++i) a[i]=s[i]-';
    scanf(); );
    ;i<=len2;++i) b[i+len1-len2]=s[i]-';
    dp[][][][][]=;
    int i,j,k,l,t,I,J,K,L,T;
    ;i<len1;i++)
      ;j<;j++)
        ;k<;k++)
          ;l<;l++)
            ;t<;t++)
                if(dp[i][j][k][l][t])
                  ;s1<=;s1++)
                    )
                      ;s2<=;s2++)
                        )
                          ;s3<=;s3++)
                            )
                            {
                                I=i+;
                                J=j*+a[i+]-s1-s2-s3;
                                 || J>) continue;
                                ]) continue;
                                K=(k || s1>b[i+]);
                                ]) continue;
                                L=(l || s2>b[i+]);
                                ]) continue;
                                T=(t || s3>b[i+]);
                                ADD(dp[I][J][K][L][T],dp[i][j][k][l][t]);
                            }
    ;
    ;k<;k++)
        ;l<;l++)
            ;t<;t++)
                ADD(ans,dp[len1][][k][l][t]);
    printf("%d",ans);
}

正解

10.1综合强化刷题 Day2 afternoon的更多相关文章

  1. 10.1综合强化刷题 Day3 afternoon

    竞赛时间:????年??月??日??:??-??:?? 题目名称 a b c 名称 a b c 输入 a.in b.in c.in 输出 a.out b.out c.out 每个测试点时限 1s 1s ...

  2. 10.1综合强化刷题 Day2 morning

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

  3. 10.1综合强化刷题 Day1 afternoon

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

  4. 10.1综合强化刷题 Day2

    a[问题描述]你是能看到第一题的 friends呢.                                                —— hja世界上没有什么比卖的这 贵弹丸三还令人绝 ...

  5. 10.1综合强化刷题 Day3 morning

    竞赛时间:????年??月??日??:??-??:?? 题目名称 a b c 名称 a b c 输入 a.in b.in c.in 输出 a.out b.out c.out 每个测试点时限 1s 1s ...

  6. 10.1综合强化刷题 Day7

                                                                                       noip提高组模拟赛       ...

  7. 10.1综合强化刷题 Day6

    T1 排序 题目描述 小Z 有一个数字序列a1; a2; .... ; an,长度为n,小Z 只有一个操作:选 定p(1<p<n),然后把ap 从序列中拿出,然后再插⼊到序列中任意位置. ...

  8. 10.1综合强化刷题 Day5

    T1 拼不出的数 lost.in/.out/.cpp[问题描述]3 个元素的集合{5; 1; 2}的所有子集的和分别是0; 1; 2; 3; 5; 6; 7; 8.发现最小的不能由该集合子集拼出的数字 ...

  9. 10.1综合强化刷题 Day4

    财富(treasure) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有n个小伙伴.每个小伙伴有一个身高hi. 这个游戏是这样的,LYK生活的环境是以 ...

随机推荐

  1. poj2955:Brackets

    Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8716   Accepted: 4660 Descript ...

  2. FreeMarker的基础语法使用 && 心得和技巧

    FreeMarker语言 FreeMarker语言概述 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写. FreeMarker被设计用来生成HTML Web ...

  3. How to check if Visual Studio 2005 SP1 is installed

    How to check if Visual Studio 2005 SP1 is installed Check the following registry key. HKEY_LOCAL_MAC ...

  4. luogu3810 【模板】三维偏序(陌上花开)

    ref1 ref2 ref3 ref4 #include <algorithm> #include <iostream> #include <cstdio> usi ...

  5. 【4Sum】cpp

    题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = ...

  6. RSA进阶之低加密指数攻击

    适用场景: n很大,4000多位,e很小,e=3 一般来说,e选取65537.但是在RSA加密的时候有可能会选用e=3(不要问为什么,因为选取e =3省时省力,并且他可能觉得n在4000多位是很安全的 ...

  7. 使用CORS解决flask前端页面跨域问题

    from flask import Flask from flask_cors import CORS app = Flask(__name__) CORS(app) @app.route(" ...

  8. UVALive 6319 暴力

    思路:直接vector暴力 #include<iostream> #include<vector> #include<cstring> #include<cs ...

  9. linux系统——日志文件系统及性能分析

    Linux日志文件系统及性能分析 日志文件系统可以在系统发生断电或者其它系统故障时保证整体数据的完整性,Linux是目前支持日志文件系统最多的操作系统之一,本文重点研究了Linux常用的日志文件系统: ...

  10. 光线追踪(raytracing)

    光线追踪(raytracing) 题目描述 考虑一个二维平面,摄像机在(0,0)(0,0)的位置,初始时平面上没有障碍物.现在执行QQ次操作,操作有两种(假设这是第ii次操作,1≤i≤Q1≤i≤Q): ...