zoukankan      html  css  js  c++  java
  • 2017.11.8 Noip2017 考前模拟赛

    ----------------------------------T1----------------------------------

    ——>足球联赛

    题目描述

    巴蜀中学新一季的足球联赛开幕了。

    足球联赛有 n 只球队参赛,每赛季,每只球队要与其他球队各赛两场,主客各一场,赢一场得 3 分,输一场不得分,平局两只队伍各得一分。

    英勇无畏的小鸿是机房的主力前锋, 她总能在关键时刻踢出一些匪夷所思的妙球。

    但是很可惜,她过早的燃烧完了她的职业生涯,不过作为一个能够 Burning 的 girl,她的能力不止如此,她还能预测这个赛季所有球队的比赛结果。

    虽然她能准确预测所有比赛的结果,但是其实她不怎么厉害,Mr.Gao 上数学课时她总是在 sleep,

    因此她的脑里只有整数没有实数,而且,她只会 10 以内非负整数的加法运算,

    因此她只有结果却无法知道谁会获得联赛的冠军。

    小鸿想给冠军队伍的所有队员一个拥抱,所以她把计算结果的任务交给了你:

    现在,给你一个 n*n 的矩阵表示比赛情况。

    第 i 行第 j 列的字母表示在第 i 只队伍在主场迎战第 j 只队伍的比赛情况,W 表示主队赢,L 表示主队输,D 表示平局。

    现在需要你给出最后能得到小鸿拥抱的队伍编号,如有多支队伍分数最高,按字典序输出编号

    输入输出格式

    输入格式:

    第一行一个整数 n。

    接下来 n 行,每行 n 个字符,表示输赢情况。

    第 i 行第 i 列为 - ,因为一只队伍不可能与自己比赛。

    输出格式:

    输出得分最高的队伍编号。如有多个在一行中输出,用一个空格分开。

    输入输出样例

    输入样例#1:
    3
    -WW
    W-W
    WW-
    输出样例#1: 
    1 2 3
    输入样例#2: 
    5
    -DWWD
    L-WLL
    DD-WD
    DDL-L
    DDLL-
    输出样例#2:
    1

    说明

    对于 40%的数据,满足 N<=20

    对于 100%的数据,满足 N<=50

    思路=A=

      大模拟,如果主场赢了就+=3,输了就让另一个+=3(写成++,蠢哭了qaq),如果平局就双方++

    代码酱=u=

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    inline int read() {
        int x=0,f=1;char c=getchar();
        while(c<'0' || c>'9') { if(c=='-') f=-1; c=getchar(); }
        while('0'<=c && c<='9') x=x*10+c-'0',c=getchar();
        return x*f;
    }
    
    const int N = 60;
    int n;
    struct points {
        int id,w;
        points() { w=0; }
        bool operator < (const points &qwq ) const {
            return w > qwq.w;
        }
    } p[N];
    
    int main() {
        freopen("soccer.in","r",stdin);
        freopen("soccer.out","w",stdout);
        n=read();
        char c;
        for(int i=1; i<=n; i++) {
            p[i].id=i;
            for(int j=1; j<=n; j++) {
                cin>>c;
                if(c=='-') continue;
                else if(c=='W') p[i].w+=3;
                else if(c=='D') p[i].w++,p[j].w++;
                else if(c=='L') p[j].w+=3;
            }
        }
        sort(p+1,p+1+n);
        int x=p[1].w;
        for(int i=1; i<=n; i++) {
            if(p[i].w<x) break;
            printf("%d ",p[i].id);
        }
        fclose(stdin);fclose(stdout);
        return 0;
    }
    View Code

    ----------------------------------------------------------------------

    Ps:接下来就是单纯存个题=v=

    ----------------------------------------------------------------------

    ----------------------------------T2----------------------------------

    ——>最短路径

    题目描述

    平面内给出 n 个点,记横坐标最小的点为 A,最大的点为 B,现在小 Y 想要知道在每个点经过一次(A 点两次)的情况下从 A 走到 B,再回到 A 的最短路径。

    但他是个强迫症患者,他有许多奇奇怪怪的要求与限制条件:

    1.从 A 走到 B 时,只能由横坐标小的点走到大的点。

    2.由 B 回到 A 时,只能由横坐标大的点走到小的点。

    3.有两个特殊点 b1 和 b2, b1 在 0 到 n-1 的路上,b2 在 n-1 到 0 的路上。

    请你帮他解决这个问题助他治疗吧!

    输入输出格式

    输入格式:

    第一行三个整数 n,b1,b2,( 0 < b1,b2 < n-1 且 b1 <> b2)。n 表示点数,从 0 到 n-1 编号,b1 和 b2 为两个特殊点的编号。

    以下 n 行,每行两个整数 x、y 表示该点的坐标(0 <= x,y <= 2000),从 0 号点顺序给出。

    Doctor Gao 为了方便他的治疗,已经将给出的点按 x 增序排好了。

    输出格式:

    输出仅一行,即最短路径长度(精确到小数点后面 2 位)

    输入输出样例

    输入样例#1:
    5 1 3
    1 3
    3 4
    4 1
    7 5
    8 3
    输出样例#1:
    18.18

    说明

    20%的数据 n<=20

    60%的数据 n<=300

    100%的数据 n<=1000

    对于所有数据 x,y,b1,b2 如题目描述.

    T代码(暴力)

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <ctime>
    #include <cstdlib>
    using namespace std;
    
    inline int read() {
        int x=0,f=1;char c=getchar();
        while(c<'0' || c>'9') { if(c=='-') f=-1; c=getchar(); }
        while('0'<=c && c<='9') x=x*10+c-'0',c=getchar();
        return x*f;
    }
    
    const int N = 1015;
    int n,AB,BA,t;
    double ans=1e8,jl[N][N];
    bool vis[N];
    struct point {
        int x,y;
    } P[N];
    
    double getjl(int a,int b) {
        int x=P[a].x,y=P[a].y,x2=P[b].x,y2=P[b].y;
        double p=max(x-x2,x2-x),q=max(y-y2,y2-y);
        p*=p;q*=q;
        return sqrt(p+q);
    }
    
    void dfs(int now,int cnt,double nowl) {
        if(nowl>ans) return;
        if(now!=0) vis[now]=true;
        if(now==n-1 && cnt==1) {
            if(!vis[AB]) return;
            dfs(now,2,nowl);
        }
        if(now==0 && cnt==2) {
            for(int i=1; i<n; i++) if(!vis[i]) return;
            if(ans>nowl) {
                ans=nowl;
                return;
            }
        } 
        if(cnt==1) {
            for(int i=now+1; i<n; i++) {
                if(!vis[i] && i!=BA) {
                    dfs(i,1,nowl+jl[now][i]);
                    vis[i]=false;
                } 
            }
        }
        else {
            for(int i=now-1; i>=0; i--) {
                if(!vis[i] && i!=AB) {
                    dfs(i,2,nowl+jl[now][i]);
                    vis[i]=false;
                }
            }
        }
    }
    
    int main() {
        freopen("paths.in","r",stdin);
        freopen("paths.out","w",stdout);
        n=read();AB=read();BA=read();
        for(int i=0; i<n; i++)
            P[i].x=read(),P[i].y=read();
        for(int i=0; i<n; i++)
            for(int j=0; j<n; j++) {
                if(i==j) continue;
                jl[i][j]=getjl(i,j);
            }
        dfs(0,1,0.00);
        printf("%.2lf",ans);
        fclose(stdin);fclose(stdout);
        return 0;
    }
    View Code

    ----------------------------------T3----------------------------------

    ——>阿 Q 的停车场

    题目描述

    刚拿到驾照的 KJ 总喜欢开着车到处兜风,玩完了再把车停到阿 Q 的停车场里,虽然她对自己停车的水平很有信心,

    但她还是不放心其他人的停车水平,尤其是 Kelukin。

    于是,她每次都把自己的爱车停在距离其它车最远的一个车位。

    KJ 觉得自己这样的策略非常科学,于是她开始想:

    在一个停车场中有一排车位,从左到右编号为 1 到 n,初始时全部是空的。

    有若干汽车,进出停车场共 m 次。

    对于每辆进入停车场的汽车,会选择与其它车距离最小值最大的一个车位,若有多个符合条件,选择最左边一个。

    KJ 想着想着就睡着了,在她一旁的 Kelukin 想帮她完成这个心愿,但是他又非常的懒,不愿意自己动手,于是就把这个问题就留给了你:

    在 KJ 理想的阿 Q 的停车场中,给你车辆进出的操作序列,依次输出每辆车的车位编号。

    输入输出格式

    输入格式:

    第一行,两个整数 n 和 m,表示停车场大小和操作数;

    接下来 m 行,每行两个整数 F 和 x

    F 是 1 表示编号为 x 的车进停车场;

    F 是 2 表示编号为 x 的车出停车场;

    保证操作合法,即:

    出停车场的车一定目前仍在停车场里;

    停车场内的车不会超过 n;

    输出格式:

    对于所有操作 1,输出一个整数,表示该车车位的编号。

    输入输出样例

    输入样例#1:
    7 11
    1 15
    1 123123
    1 3
    1 5
    2 123123
    2 15
    1 21
    2 3
    1 6
    1 7
    1 8
    输出样例#1: 
    1
    7
    4
    2
    7
    4
    1
    3

    说明

    对 30%的数据 n<=1000 ,m<=1000

    对 60%的数据 n<=200000,m<=2000

    对 100%的数据 n,m<=200000,车的编号小于等于 10^6

    T代码(暴力)

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    using namespace std;
    
    inline int read() {
        int x=0,f=1;char c=getchar();
        while(c<'0' || c>'9') { if(c=='-') f=-1; c=getchar(); }
        while('0'<=c && c<='9') x=x*10+c-'0',c=getchar();
        return x*f;
    }
    
    const int C = 100015;
    const int M = 200025;
    int n,m,F,x,now;
    int q[M];
    bool vis[C];
    struct car {
        int id,w;
    } a[M];
    
    int main() {
        freopen("park.in","r",stdin);
        freopen("park.out","w",stdout);
        n=read();m=read();
        while(m--) {
            F=read();x=read();
            if(F==1) {
                a[now].id=x;
                memset(q,0,sizeof(q));
                int top=0,w=1;
                for(int i=1; i<=n; i++)
                    if(vis[i]) q[top++]=i;
                for(int i=1,Min,Max=0; i<=n; i++) {
                    if(vis[i]) continue;
                    Min=M;
                    for(int j=0,y; j<top; j++) {
                        y=max(i-q[j],q[j]-i);
                        if(y<Min) Min=y;
                    }
                    if(Max<Min) Max=Min,w=i;
                }
                vis[w]=true;
                a[now++].w=w;
                printf("%d
    ",w);
            }
            else {
                int id;
                for(int i=0; i<n; i++)
                    if(a[i].id==x) {
                        id=a[i].w;
                        break;
                    }
                vis[id]=false;
            }
        }
        fclose(stdin);fclose(stdout);
        return 0;
    }
    View Code

     

  • 相关阅读:
    人脸识别-常用的数据库Face Databases From Other Research Groups
    447. Number of Boomerangs
    356. Line Reflection
    149. Max Points on a Line
    279. Perfect Squares
    264. Ugly Number II
    204. Count Primes
    263. Ugly Number
    202. Happy Number
    4. Median of Two Sorted Arrays
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/7804202.html
Copyright © 2011-2022 走看看