• 2016-11-17试题解题报告


    2016-11-17试题解题报告

    By shenben 

     

    水灾(sliker.cpp/c/pas 1000MS  64MB

    大雨应经下了几天雨,却还是没有停的样子。土豪CCY刚从外地赚完1e元回来,知道不久除了自己别墅,其他的地方都将会被洪水淹没。

    CCY所在的城市可以用一个N*M(N,M<=50)的地图表示,地图上有五种符号:“. * X D S”。其中“X”表示石头,水和人都不能从上面经过。“.”表示平原,CCY和洪水都可以经过。“*”表示洪水开始地方(可能有多个地方开始发生洪水)。“D”表示CCY的别墅。“S”表示CCY现在的位置。

    CCY每分钟可以向相邻位置移动,而洪水将会在CCY移动之后把相邻的没有的土地淹没(从已淹没的土地)。

    CCY回到别墅的最少时间。如果聪哥回不了家,就很可能会被淹死,那么他就要膜拜黄金大神涨RP来呼叫直升飞机,所以输出“ORZ hzwer!!!”。

    输入文件 sliker.in

    输出文件 sliker.out

    Input

    3 3

    D.*

    .S.

     

    Output

    3

     

    Input

    3 3

    D.*

    ..S

     

    Output

    ORZ hzwer!!!

     

    Input

    3 6

    D*.

    .X.X..

    .S.

     

    Output

    6

     

     

     

     

     

     

    某种数列问题  (jx.cpp/c/pas) 1000MS 256MB

     

    众所周知,chenzeyu97有无数的妹子(阿掉!>_<),而且他还有很多恶趣味的问题,继上次纠结于一排妹子的排法以后,今天他有非(chi)(bao)(cheng)(zhe)去研究一个奇怪的问题。有一堆他的妹子站成一排,然后对于每个妹子有一个美丽度,当然美丽度越大越好,chenzeyu97妹子很多,但是质量上不容乐观,经常出现很多美丽度为负数的妹子(喜闻乐见)chenzeyu97希望从一排妹子里找出3队连续的妹子,使她们的美丽度和最大。注意,一个妹子不能被编入多个队伍而且一定要拿出三队,不然czy会闲着没事做~

    简单滴说就是:

    给定一个数列,从中找到3个无交集的连续子数列使其和最大。

    【输入文件】

    第一行一个数n,表示数列长度。

    接下来有n行,每行一个数,第i行为第i个数。

     

    【输出文件】

    仅有一个数,表示最大和。

     

    【样例输入】 jx.in

    10

    -1

    2

    3

    -4

    0

    1

    -6

    -1

    1

    -2

     

    【样例输出】 jx.out

    7

     

    【样例说明】

    第一队妹子取23

    第二队妹子取01

    第三队妹子取1

     

    【数据范围】

    请大家放心,虽然chenzeyu97妹子无数,但是这次他叫来的个数n是有限的。=v=

    对于30%的数据,妹子数不大于200

    对于60%的数据,妹子数不大于2000

    对于100%的数据,妹子数1000000

    而且,由于chenzeyu97没有CCR那样的影响力,所以他的妹子选完的最大美丽度和不超过maxlongint(:CCR随便选就爆long long,因为他是把妹狂魔=V=)

     

     

    密码锁 1000MS 512MB

    Input: password.in

    Output: password.out

    【题目描述】

    hzwer有一把密码锁,由N个开关组成。一开始的时候,所有开关都是关上的。当且仅当开关x1,x2,x3,...xk为开,其他开关为关时,密码锁才会打开。

    他可以进行M种的操作,每种操作有一个size[i],表示,假如他选择了第i种的操作的话,他可以任意选择连续的size[i]个格子,把它们全部取反。(注意,由于黄金大神非常的神,所以操作次数可以无限>_<

    本来这是一个无关紧要的问题,但是,黄金大神不小心他的钱丢进去了,没有的钱他哪里能逃过被chenzeyu97 NTR的命运?>_<  于是,他为了虐爆czy,也为了去泡更多的妹子,决定打开这把锁。但是他那么神的人根本不屑这种水题。于是,他找到了你。

    你的任务很简单,求出最少需要多少步才能打开密码锁,或者如果无解的话,请输出-1

     

    【输入格式】

    1行,三个正整数NKM,如题目所述。

    2行,K个正整数,表示开关x1,x2,x3..xk必须为开,保证x两两不同。

    第三行,M个正整数,表示size[i]size[]可能有重复元素。

    【输出格式】

    输出答案,无解输出-1

    【样例输入1

    10 8 2

    1 2 3 5 6 7 8 9

    3 5

    【样例输出1

    2

    【样例输入2

    3 2 1

    1 2

    3

    【样例输出2

    -1

     

     

    【数据规模】

    对于50%的数据,1N201k51m3;

    对于另外20%的数据,1N100001k5,1m30;

    对于100%的数据,1N100001k101m100

     

     

    T1代码:

    //寒假西月栋出的原题
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int N=55;
    char a[N][N];
    bool vis[N][N];
    int n,m,ex,ey,d[N][N],dis[N][N];
    struct node{
        int x,y;
        node(int x=0,int y=0):x(x),y(y){}
    };
    const int dx[]={0,0,1,-1};
    const int dy[]={1,-1,0,0};
    inline bool inside(int &x,int &y){
        return x>0&&x<=n&&y>0&&y<=m;
    }
    void bfs(int sx,int sy){
        memset(vis,0,sizeof vis);
        queue<node>q;
        q.push(node(sx,sy));
        vis[sx][sy]=1;
        d[sx][sy]=0;
        while(!q.empty()){
            node h=q.front();q.pop();
            int px=h.x,py=h.y;
            vis[px][py]=0;
            for(int i=0,nx,ny;i<4;i++){
                nx=px+dx[i];
                ny=py+dy[i];
                if(inside(nx,ny)&&a[nx][ny]!='X'&&a[nx][ny]!='D'){
                    if(d[nx][ny]>d[px][py]+1){
                        d[nx][ny]=d[px][py]+1;
                        if(!vis[nx][ny]){
                            vis[nx][ny]=1;
                            q.push(node(nx,ny));
                        }
                    }
                }
            }
        }
    }
    void spfa(int sx,int sy){
        memset(vis,0,sizeof vis);
        queue<node>q;
        q.push(node(sx,sy));
        vis[sx][sy]=1;
        dis[sx][sy]=0;
        while(!q.empty()){
            node h=q.front();q.pop();
            int px=h.x,py=h.y;
            vis[px][py]=0;
            for(int i=0,nx,ny;i<4;i++){
                nx=px+dx[i];
                ny=py+dy[i];
                if(inside(nx,ny)&&a[nx][ny]!='X'){
                    if(dis[px][py]+1>=d[nx][ny]) continue;
                    if(dis[nx][ny]>dis[px][py]+1){
                        dis[nx][ny]=dis[px][py]+1;
                        if(!vis[nx][ny]){
                            vis[nx][ny]=1;
                            q.push(node(nx,ny));
                        }
                    }
                }
            }
        }
    }
    #define name "sliker"
    int main(){
        freopen(name".in","r",stdin);
        freopen(name".out","w",stdout);
        memset(dis,0x3f3f3f3f,sizeof dis);
        memset(d,0x3f3f3f3f,sizeof d);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            scanf("%s",a[i]+1);
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(a[i][j]=='*'){
                    bfs(i,j);
                }
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(a[i][j]=='S'){
                    spfa(i,j);
                }
                if(a[i][j]=='D'){
                    ex=i;ey=j;
                }
            }
        }
        if(dis[ex][ey]<0x3f3f3f3f) printf("%d
    ",dis[ex][ey]);
        else puts("ORZ hzwer!!!");
        fclose(stdin);
        fclose(stdout);
        return 0;
    }

    T2代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    inline int read(){
        register int x=0;bool f=1;
        register char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    const int N=1e6+10;
    int n,a[N];
    int dp[N][4][2];
    //3个最大连续字段和 
    #define name "jx"
    int main(){
        freopen(name".in","r",stdin);
        freopen(name".out","w",stdout);
        memset(dp,-0x3f3f3f3f,sizeof dp);
        n=read();
        for(int i=1;i<=n;i++) a[i]=read();
        dp[0][0][0]=0;//dp[i][j][0/1]选到第i个人,选了j队,第i个人选与不选
        for(int i=1;i<=n;i++){
            for(int j=0;j<=3;j++){
                dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j][1]);
                if(j-1>=0) dp[i][j][1]=max(dp[i][j][1],max(dp[i-1][j-1][0],dp[i-1][j-1][1])+a[i]);
                dp[i][j][1]=max(dp[i][j][1],dp[i-1][j][1]+a[i]);
            }
        }
        printf("%d
    ",max(dp[n][3][0],dp[n][3][1]));
        fclose(stdin);
        fclose(stdout);
        return 0;
    }

    T3代码:

    /*
    弃疗ing
    输出-1 10分
    */

     

     

     

  • 相关阅读:
    Rocky Linux8国内镜像源
    强制缓存和协商缓存的区别
    从源码来看VUE的执行流程
    plugin
    判断数据类型的方法
    获取函数参数
    BFC
    VUE的$nextTick
    HTTP
    JavaScript创建和触发自定义事件
  • 原文地址:https://www.cnblogs.com/shenben/p/6074128.html
Copyright © 2020-2023  润新知