2020 December Contest Bronze 题解

T1 Do You Know Your ABCs?

题面描述:

Farmer John 的奶牛正在 "mooZ" 视频会议平台上举行每日集会。她们发明了一个简单的数字游戏,为会议增添一些乐趣。

Elsie 有三个正整数 A、B 和 C(A≤B≤C)。这些数字是保密的,她不会直接透露给她的姐妹 Bessie。她告诉 Bessie 七个范围在 1…109 之间的整数(不一定各不相同),并宣称这是 A、B、C、A+B、B+C、C+A 和 A+B+C 的某种排列。

给定这七个整数,请帮助 Bessie 求出 A、B 和 C。可以证明,答案是唯一的。

输入格式(从终端/标准输入读入):

输入一行,包含七个空格分隔的整数。

输出格式(输出至终端/标准输出):

输出 A、B 和 C,用空格分隔。

输入样例:

2 2 11 4 9 7 9

输出样例:

2 2 7

测试点性质:

测试点 2-3 满足 C≤50。
测试点 4-10 没有额外限制。

解题思路

显然

\[\forall \text{A,B,C} \in \mathbb{N} \]

所以,从小到大排序,然后最小的两个一定是ABC中的一个

然后就需要判断第三个是不是另外一个

然后会发现,当且仅当如果A+B刚好等于第三个时,那么这时第四个才是C
其他情况,C必定为第三个。

简单思考题。

Code:

die码当时没保存,┭┮﹏┭┮

T2 Daisy Chains

题面描述

每天,作为她绕农场行走的一部分,奶牛 Bessie 会经过她最喜爱的草地,其中种有 N 朵花(五颜六色的雏菊),编号为 1…N(1≤N≤100),排列成一行。花 i 有 pi 朵花瓣(1≤pi≤1000)。
作为一名崭露头角的摄影家,Bessie 决定给这些花拍些照片。具体地说,对于每一对满足 1≤i≤j≤N 的花 (i,j),Bessie 会给从花 i 到花 j 之间的所有花(包括 i 和 j)拍一张照。

后来 Bessie 查看这些照片时注意到有些照片里存在「平均」的花——一朵恰好有 P 朵花瓣的花,其中 P 等于照片中所有花的花瓣数量的平均值。

Bessie 的照片中有几张存在平均的花?

输入格式(从终端/标准输入读入):

输入的第一行包含 N。第二行包含 N 个空格分隔的整数 p1…pN。

输出格式(输出至终端/标准输出):

输出存在平均的花的照片数量。

输入样例:

4
1 1 2 3

输出样例:

6

样例解释

每张仅包含一朵花的照片均会被计入答案(在这个样例中有 4 张)。另外,在这个样例中 (i,j) 为 (1,2) 和 (2,4) 所对应的照片也存在平均的花。

解题思路

数据量很小,直接暴力模拟。

同样,die码没有保存。。

T3 Stuck in a Rut

题面描述

Farmer John 最近扩大了他的农场,从奶牛们的角度看来这个农场相当于是无限大了!奶牛们将农场上放牧的区域想作是一个由正方形方格组成的无限大二维方阵,每个方格中均有美味的草(将每个方格看作是棋盘上的一个方格)。Farmer John 的 N 头奶牛(1≤N≤50)初始时位于不同的方格中,一部分朝向北面,一部分朝向东面。
每一小时,每头奶牛会执行以下二者之一:

如果她当前所在的方格里的草已经被其他奶牛吃掉了,则她会停下。
吃完她当前所在的方格中的所有草,并向她朝向的方向移动一个方格。
经过一段时间,每头奶牛的身后会留下一条被啃秃了的轨迹。

如果两头奶牛在一次移动中移动到了同一个有草的方格,她们会分享这个方格中的草,并在下一个小时继续沿她们朝向的方向移动。

请求出每头奶牛吃到的草的数量。有些奶牛永远不会停下,从而吃到无限多的草。

输入格式(从终端/标准输入读入):

输入的第一行包含 N。以下 N 行,每行描述一头奶牛的起始位置,包含一个字符 N(表示朝向北面) 或 E(表示朝向东面),以及两个非负整数 x 和 y(0≤x≤109,0≤y≤109)表示方格的坐标。所有 x 坐标各不相同,所有 y 坐标各不相同。
为了使方向和坐标尽可能明确,如果一头奶牛位于方格 (x,y) 并向北移动,她会到达方格 (x,y+1)。如果她向东移动,她会到达方格 (x+1,y)。

输出格式(输出至终端/标准输出):

输出 N 行。输出的第 i 行包含输入中的第 i 头奶牛吃到草的方格的数量。如果一头奶牛可以吃到无限多的草,为这头奶牛输出 "Infinity"。

输入样例:

6
E 3 5
N 5 3
E 4 6
E 10 4
N 11 2
N 8 1

输出样例:

5
3
Infinity
Infinity
2
5

测试点性质:

测试点 2-5 中,所有坐标不超过 100。
测试点 6-10 没有额外限制。

解题思路

说实话,真是一道好(duliu)题。

做了很久,个人思路就是将可能会相遇的点全部保存下来,然后一个一个进行筛选。

筛选的时候要注意,你不能只用一个book数组记录哪一个点已经停了下来,而是应该继续记录那个点运动了多少,下一次如果运动不到应该运动到的相遇地方,就pass。

蒟蒻die码

#include <bits/stdc++.h>
#define pb push_back
using namespace std;
template <typename T>inline void read(T& t){
    t=0; register char ch=getchar();
    while(!('0'<=ch&&ch<='9')){if(ch=='-') t=-1;ch=getchar();}
    while(('0'<=ch&&ch<='9')){t=((t<<1)+(t<<3))+ch-'0'; ch=getchar();}
}
template <typename T,typename... Args> inline void read(T& t, Args&... args){
    read(t);read(args...);
}
template <typename T>inline void write(T x){
    if(x<0) putchar('-'),x=~(x-1); int s[40],top=0;
    while(x) s[++top]=x%10,x/=10; if(!top) s[++top]=0;
    while(top) putchar(s[top--]+'0');
}
int n;
int dis[114514];
vector<pair<int,pair<int,int> > >Up,Right;
struct Meet{
    int x,y,lt,rt,mint;
    bool w;
    int ai,bi;
    bool operator < (const Meet &MeEt) const{
        return mint<MeEt.mint;
    }
    void print(){
        cout<<lt<<' '<<rt<<' '<<mint<<' '<<w<<' '<<ai<<' '<<bi<<endl;;
    }
};
bool book[114514];
int boko[114514];
vector<Meet>meet;
int main(){
    cin>>n;
    for(int i=1;i<=n;++i){
        char ch;
        cin>>ch;
        int x,y;
        read(x,y);
        if(ch=='E')
            Right.pb(make_pair(x,make_pair(y,i)));
        else
            Up.pb(make_pair(x,make_pair(y,i)));
    }
    for(int i=0;i<Right.size();++i)
        for(int j=0;j<Up.size();++j){
            #define x first
            #define y second.first
            #define idx second.second
            if(Right[i].x>Up[j].x||Right[i].y<Up[j].y) continue;
            int bx=Up[j].x,by=Right[i].y;
            meet.pb({bx,by,bx-Right[i].x,by-Up[j].y,min(bx-Right[i].x,by-Up[j].y),(bx-Right[i].x<by-Up[j].y),Right[i].second.second,Up[j].second.second});
            #undef x
            #undef y
            #undef idx
        }
    sort(meet.begin(),meet.end());
    memset(book,0,sizeof(book));
    memset(dis,0x3f,sizeof(dis));
    for(int i=0;i<meet.size();++i){
        if(book[meet[i].ai]||book[meet[i].bi]){
            //如果两个之中有一个之前已经被碰过了
            if(book[meet[i].ai]&&boko[meet[i].ai]/*向右的最大距离*/<meet[i].x/*比我碰面的距离*/) continue;
            if(book[meet[i].bi]&&boko[meet[i].bi]/*向上的最大距离*/<meet[i].y/*比我碰面的距离*/) continue;
           //这里的判断有问题,就是说,就算我有一个碰过了,但是草还是会被吃掉那个时候,所以很难搞
           //我一个book应该存的是,如果我停止了,那么我草吃到了哪里,而不是有没有被碰掉
           //book存完之后,就只需要判断一下我这个被碰过的点有没有走到那个位置就ok了。
        }
        if(meet[i].lt==meet[i].rt) continue;
        if(meet[i].w){
            dis[meet[i].bi]=meet[i].rt;
            book[meet[i].bi]=1;
            boko[meet[i].bi]=meet[i].y;//现在我这个是向上走的,并且我现在只可以走到meet[i].y的位置了。
        }else{
            dis[meet[i].ai]=meet[i].lt;
            book[meet[i].ai]=1;
            boko[meet[i].ai]=meet[i].x;//现在我这个是向上走的,并且我现在只可以走到meet[i].y的位置了。
        }
    }
    for(int i=1;i<=n;++i) if(dis[i]==0x3f3f3f3f) cout<<"Infinity"<<'\n';
    else cout<<dis[i]<<'\n';
    return 0;
}
posted @ 2021-12-03 20:32  Mercury_City  阅读(157)  评论(0编辑  收藏  举报