码迷,mamicode.com
首页 > 其他好文 > 详细

2017.11.8 Noip2017 考前模拟赛

时间:2017-11-08 16:05:35      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:ble   event   fclose   using   void   超过   ext   space   足球   

----------------------------------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\n",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

 

2017.11.8 Noip2017 考前模拟赛

标签:ble   event   fclose   using   void   超过   ext   space   足球   

原文地址:http://www.cnblogs.com/zxqxwnngztxx/p/7804202.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!