BestCoder Round #86

来源:互联网 发布:磁力链接软件 编辑:程序博客网 时间:2024/06/06 12:44

题目链接:hdoj 5804   hdoj 5805  hdoj 5806


A:


水题---然而我开始以为是一天买一个----wrong了几次--


#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define LL __int64LL shu[100100];int n,m;bool cmp(LL x,LL y){    return x>y;}int main(){    int t;scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        LL s=0,q;        for (int i=0;i<n;i++)        {            scanf("%I64d",&shu[i]);            s+=shu[i];        }        char ch[100100];        for (int i=0;i<m;i++)        {            scanf("%I64d",&q);            if (q>s)            ch[i]='1';            else            ch[i]='0';        }        ch[m]=0;        printf("%s\n",ch);    }    return 0;}


B:

删除一个数会减少两个原来的差值--然后增加一个差值---

我们就讨论这个变化对最大值带来的影响就行了



#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define LL __int64LL shu[100100],cha[100100],pp[100100];int n,m;bool cmp(LL x,LL y){    return x>y;}int main(){    int t;scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        for (int i=1;i<=n;i++)        scanf("%I64d",&shu[i]);        for (int i=1;i<n;i++)        {            cha[i]=abs(shu[i]-shu[i+1]);            pp[i]=cha[i];        }        LL ji,zui;        ji=cha[1];zui=cha[n-1];        sort(cha+1,cha+n);        LL s=0;        if (cha[n-1]==ji)        s+=cha[n-2];        else        s+=cha[n-1];        if (cha[n-1]==zui)        s+=cha[n-2];        else        s+=cha[n-1];        if (n==3)        s+=abs(shu[1]-shu[3]);        else        {            for (int i=1;i<n-1;i++)            {                ji=abs(shu[i]-shu[i+2]);                if (ji>=cha[n-1])                s+=ji;                else                {                    LL a,b;                    a=max(pp[i],pp[i+1]);                    b=min(pp[i],pp[i+1]);                    if (a==cha[n-1])                    {                        if (ji>=cha[n-2])                        s+=ji;                        else                        {                            if (b==cha[n-2])                            s+=max(ji,cha[n-3]);                            else                            s+=cha[n-2];                        }                    }                    else                    s+=cha[n-1];                }            }        }        printf("%I64d\n",s);    }    return 0;}




C:

一个for循环滚过去了---

令区间的开头先为1--

再找到第k个大于等于m的数的位置P---

即从1到p,到p+1,,,,到N,以1开始的这N-P+1个区间可以---

然后移动开头---并判断是否还有K个----


#include<cstdio>#include<cstring>#include<algorithm>#define LL __int64using namespace std;int shu[202000];int main(){    int t;scanf("%d",&t);    while (t--)    {        int n,m,k;        scanf("%d%d%d",&n,&m,&k);        for (int i=1;i<=n;i++)        scanf("%d",&shu[i]);        int ans=0,kai=1;        LL s=0;        for (int i=1;i<=n;i++)        {            if (shu[i]>=m)            ans++;        //    printf("%d  %d\n",k,ans);            if (ans==k)            {        //        printf("%d 6666",i);                while (shu[kai]<m)                {                    s+=(n-i+1);                    kai++;                }                s+=(n-i+1);                kai++;                ans--;            }        //    printf("%d   66\n",ans);        }        printf("%I64d\n",s);    }    return 0;}



0 0
原创粉丝点击