2017.10.17一试

来源:互联网 发布:西南大学网络教育官网 编辑:程序博客网 时间:2024/06/05 04:50

何处望江南。。。

越考越虚。。。就是这种感觉。。。

T1

其实只是一个简单的差分而已。
但我——
莫名RE。为何在本机上各种正常的代码,会在评测时崩溃呢?
Emm…Accepted or not Accepted(Runtime Error) ,that is the question.

然后把读入优化改成了Scanf。啊,过了。
呜呼哀哉,呜呼,呜噗哀哉。
代码如下:

//I want something just like this.#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<ctime>#include<cmath>#include<algorithm>#include<cctype>#include<iomanip>#include<queue>#include<map>using namespace std;int chr[1440];int n;int x;int h1,m1,h2,m2;char s;int ans;int read(){    int sum=0,f=1;char ch;    for(ch=getchar();(ch>'9'||ch<'0')&&ch!='-';ch=getchar());    if(ch=='-') {f=-1;ch=getchar();}    for(;ch>='0'&&ch<='9';ch=getchar())    sum=(sum<<3)+(sum<<1)+ch-48;    return sum*f;}inline void write(int x){     if(x<0) putchar('-'),x=-x;     if(x>9) write(x/10);     putchar(x%10+'0');}int main(){    ios::sync_with_stdio(false);    cin.tie(0);    //freopen("chair.in","r",stdin);    //freopen("chair.out","w",stdout);    int lt,ct;    n=read();    for(int i=1;i<=n;i++)    {        x=read();scanf("%d:%d",&h1,&m1);        ct=h1*60+m1;        scanf("%d:%d",&h2,&m2);        lt=h2*60+m2;        for(int j=ct;j<lt;j++)        {            chr[j]+=x;        }    }    ans=0;    for(int i=1;i<=1440;i++)    {        ans=max(ans,chr[i]);    }    write(ans);    return 0;}

T2

N^2暴力模拟40分。
对于AC代码:

快使用双向链表呼呼哈hie。

用双向链表将多个子串连接起来,同理连接字串内的数字。每次O(1)删除不和谐的数,然后再依次检查合并或删除子串。
代码如下:

//I want something just like this.#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<ctime>#include<cmath>#include<algorithm>#include<cctype>#include<iomanip>#include<queue>#include<map>using namespace std;const int N=100005;const int INF=0x7fffffff;struct node{    int val,pos;}b[N];int t,n;int cnt,tmp;int a[N],del[N],in[N];int bz;inline int read(){    int i=0,f=1;    char c;    for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar());    if(c=='-')        c=getchar(),f=-1;    for(;c>='0'&&c<='9';c=getchar())        i=(i<<3)+(i<<1)+c-'0';    return i*f;}int main(){    t=read();    while(t--)    {        memset(del,0,sizeof(del));        memset(in,0,sizeof(in));        n=read();        a[0]=-INF,a[n+1]=INF;        for(int i=1;i<=n;++i)            a[i]=read();        for(int i=1;i<=n;++i)            if(a[i-1]>a[i]||a[i]>a[i+1])                del[i]=1;        cnt=0;        for(int i=1;i<=n;++i)            if(del[i])            {                if(i>1&&!del[i-1]&&!in[i-1]) ++cnt,b[cnt]=(node){a[i-1],i-1},in[i-1]=1;                if(i<n&&!del[i+1]&&!in[i+1]) ++cnt,b[cnt]=(node){a[i+1],i+1},in[i+1]=1;            }        bz=1;         while(bz)        {            bz=0;b[0].val=-INF,b[cnt+1].val=INF;            for(int i=1;i<=cnt;i++)            {                in[b[i].pos]=0;                if(b[i-1].val>b[i].val||b[i].val>b[i+1].val)                    bz=1,del[b[i].pos]=1;            }            tmp=0;            for(int i=1;i<=cnt;++i)                if(del[b[i].pos])                {                    int p=b[i].pos;                    if(p>1&&!del[p-1]&&!in[p-1]) b[++tmp]=(node){a[p-1],p-1},in[p-1]=1;                    if(p<n&&!del[p+1]&&!in[p+1]) b[++tmp]=(node){a[p+1],p+1},in[p+1]=1;                }                else ++tmp,b[tmp]=b[i];            cnt=tmp;        }        cnt=0;        for(int i=1;i<=n;++i)            if(!del[i])                ++cnt;        cout<<cnt<<endl;        for(int i=1;i<=n;++i)            if(!del[i])                cout<<a[i]<<" ";        cout<<endl;    }    return 0;}

T3

区间DP。

对于00或11,可以合并成一个 大O 或 大l ,同时记录每个点的点权。
DP[L][R]表示[L,R]的球全部消除的最小次数。NUM[i]表示点i的点权。
转移方程分4种情况讨论。

#PS:有大佬妙妙的搜索搜到了60分?!

代码如下:

//I want something just like this.#include<iostream>#include<algorithm>#include<cctype>#include<cstdio>#include<queue>#include<cstring>using namespace std;const int N=505;int t;int len,cnt;int ch[N],num[N],f[N][N];char s[N];inline int read(){    int i=0,f=1;    char ch;    for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar());    if(ch=='-') f=-1,ch=getchar();    for(;ch>='0'&&ch<='9';ch=getchar()) i=(i<<1)+(i<<3)+ch-'0';    return i*f;}inline void work(){           memset(f,127,sizeof(f));    memset(num,0,sizeof(num));    cin>>s+1;    len=strlen(s+1);cnt=0;    for(int i=1;i<=len;++i)        if(s[i]!=s[i-1]) ++cnt,ch[cnt]=s[i],num[cnt]=1;        else             ++num[cnt];     for(int i=cnt;i>=1;--i)        for(int j=i;j<=cnt;++j){            if(i==j){                f[i][j]=3-num[i];                continue;            }            if(ch[i]==ch[j]){                f[i][j]=f[i+1][j-1]+max(0,3-num[i]-num[j]);                if(num[i]+num[j]<4)                    for(int k=i+2;k<j;k+=2)                        if(num[k]==1) f[i][j]=min(f[i][j],f[i+1][k-1]+f[k+1][j-1]);            }            for(int k=i;k<j;++k)                 f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);      }    cout<<f[1][cnt]<<endl;}int main(){    t=read();    while(t--) work();    return 0;}

总之,对于此次考试,嘛。。。总而言之。。。

呜呼,我说不出话!

————————————————————–by 鲁迅先生

原创粉丝点击