2017.11.2测试

来源:互联网 发布:java byte转16进制 编辑:程序博客网 时间:2024/06/05 15:44

分数:100+90+20=210
(shui的一批的数据点了个踩)
嘉年华倒计时

好气气

↑↑这个不是我↑↑


题解

T1 arrange

给出N段在同一天之内的时间,问如何取到除始末点外互不重合的时间段的数量的最大值

动规、贪心都可以,甚至还有倍增dalao

#include<bits/stdc++.h>#define ll long longusing namespace std;int read(){    int x=0,f=1;    char c=getchar();    while(!isdigit(c)){        c=getchar();        if(c=='-')f=-1;    }    while(isdigit(c)){        x=(x<<3)+(x<<1)+c-'0';        c=getchar();    }    return x*f;}int x,y,n,cnt,tmp;struct node{    int l,r;}e[200005];int f[2005];bool comp(const node &a,const node &b){    if(a.r!=b.r)return a.r<b.r;    return a.l<b.l;}int main(){//  freopen("arrange.in","r",stdin);//  freopen("arrange.out","w",stdout);    int tmp;    n=read();    for(int i=1;i<=n;i++){        x=read();y=read();        tmp=x*60+y;        e[i].l=tmp;        x=read();y=read();        tmp=x*60+y;        e[i].r=tmp;    }    sort(e+1,e+n+1,comp);    cnt=1;    for(int i=1;i<=1440;i++){        f[i]=f[i-1];        while(e[cnt].r==i){            f[i]=max(f[i],f[e[cnt].l]+1);            cnt++;        }    }    cout<<f[1440];}

T2 seq

一个由非负整数组成的序列A
给出L、R,求A的所有长度介于L到R之间的子序列中元素平均值的最大值

考试的时候90是baoli过的
评讲的时候一群江湖dalao纷纷涌现
以下,一位On2/4AC暴力dalao的代码

#include<bits/stdc++.h>#define ll long longusing namespace std;int read(){    int x=0,f=1;    char c=getchar();    while(!isdigit(c)){        c=getchar();        if(c=='-')f=-1;    }    while(isdigit(c)){        x=(x<<3)+(x<<1)+c-'0';        c=getchar();    }    return x*f;}int n,l,r,tot,maxm=0;int nb[20005],f[20005];double maxx=0;struct node{    int x;    int pos;    bool operator < (const node &a)const {        return x>a.x;    }}a[30005];int main(){//  freopen("seq.in","r",stdin);//  freopen("seq.out","w",stdout);    memset(a,0,sizeof(a));    memset(f,0,sizeof(f));    n=read();l=read();r=read();    for(int i=1;i<=n;i++){        a[i].x=read();        a[i].pos=i;        f[i]=f[i-1]+a[i].x;    }    if(l==1){        for(int i=1;i<=n;i++){            maxm=max(maxm,a[i].x);        }        cout<<maxm<<".0000";        return 0;    }    for(int i=l;i<=min(2*l,r);i++){        for(int j=1;j<=n-i+1;j++)        {            double d=(double)(f[i+j-1]-f[j-1])/i;            maxx=max(maxx,d);        }    }    printf("%.4f",maxx);}

T3 palin

给出俩字符串s、t
按原顺序从任意从中取字符组成新串,求新串的最长回文子序列的长度

最终自己用的DP

f[i][j][k][l]

表示一串从前取到了第i位,从后取到了第k位;二串从前取到了第j位,从后取到了第l位时新串回文子序列的最长长度
转移的时候稍加判断,特别是某条串最后只剩中间字符的时候,就A了

#include<bits/stdc++.h>using namespace std;char s[55],c[55];int n,m,x,maxx=0;int f[55][55][55][55];int main(){    memset(f,0,sizeof(f));    scanf("%s",s+1);    n=strlen(s+1);    scanf("%s",c+1);    m=strlen(c+1);    for(int i=1;i<=n+1;i++){        for(int j=1;j<=m+1;j++){            for(int k=n;k>=0;k--){                for(int l=m;l>=0;l--){                    x=f[i][j][k][l];                    if(i<k){                        if(s[i]==s[k]){                            f[i+1][j][k-1][l]=max(f[i+1][j][k-1][l],x+2);                        }                    }                    if(j<l){                        if(c[j]==c[l]){                            f[i][j+1][k][l-1]=max(f[i][j+1][k][l-1],x+2);                        }                    }                    if(i<=k&&j<=l){                        if(s[i]==c[l]){                            f[i+1][j][k][l-1]=max(f[i+1][j][k][l-1],x+2);                        }                        if(c[j]==s[k]){                            f[i][j+1][k-1][l]=max(f[i][j+1][k-1][l],x+2);                        }                    }                }            }        }    }    for(int i=1;i<=n+1;i++){        for(int j=1;j<=m+1;j++){            for(int k=n+1;k>=1;k--){                for(int l=m+1;l>=1;l--){                    x=f[i][j][k][l];                    if(i>k&&j>l)maxx=max(maxx,x);                    if(i==k&&j>l)maxx=max(maxx,x+1);                    if(j==l&&i>k)maxx=max(maxx,x+1);                }            }        }    }    cout<<maxx;}
原创粉丝点击