ACM | ACM Test 240111

7-1 三角形判断

分数 25

给定三条线段的长度,如何判断它们能组成一个什么类型的三角形呢?

输入格式:

输入数据第一行是一个正整数 \(N\),表示有 \(N\) 组测试用例。

接下来 \(N\) 行,每行包含三个正整数 \(A, B, C (0 < A, B, C < 10000)\),表示三条线段的长度。

输出格式:

对于每组数据给定的三条线段:

  • 如果能够组成直角三角形,请输出 "Right triangle"

  • 如果能够组成锐角三角形,请输出 "Acute triangle"

  • 如果能够组成钝角三角形,请输出 "Obtuse triangle"

  • 如果不能组成三角形,请输出 "Impossible!"

所有的输出,都不包含双引号,参见样例输出。

输入样例:

3
12 12 12
4 6 12
6 8 12

输出样例:

Acute triangle
Impossible!
Obtuse triangle

代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB

Code

#include<bits/stdc++.h>
using namespace std;


int main(){
    int n;
    cin>>n;
    while(n--){
        int a,b,c;
        cin>>a>>b>>c;
        if(a>b) swap(a,b);
        if(b>c) swap(b,c);
        if(a>b) swap(a,b);
        if(a+b>c){
            if(a*a+b*b==c*c)    cout<<"Right triangle"<<endl;
            else if(a*a+b*b>c*c)    cout<<"Acute triangle"<<endl;
            else cout<<"Obtuse triangle"<<endl;
        }else{
            cout<<"Impossible!"<<endl;
        }
        
    }
    
    return 0;
}

7-2 勇敢争第一

分数 20

在杭电ACM课的每次测试中,每一次大家都奋勇争先,想拿下第一名。

现在已知某次测验的每位同学的解题数量和罚时,希望你能够告诉老师前几名是哪些同学。

排名规则是这样的,首先依据解题数量从大到小排名,若解题数量相同,则比较罚时,罚时少的排名靠前。

输入格式:

第一行是数据组数 \(C(1 <= C <= 10)\),代表有 \(C\) 组测试数据。

每一组数据第一行为两个 \(N(2 < N <= 1000)\)\(M(1 <= M <= N)\)\(N\) 表示有 \(N\) 个人的成绩,\(M\) 表示老师需要你输出前 \(M\) 名的名单。

接下来 \(N\) 行,每一行依次给出名字 Name,解题数量 Num 和罚时 Time(名字的长度最大为 \(10, 1 <= Num <= 10, 10 <= Time <= 100000\))。

输出格式:

每组测试数据输出 \(M\) 行,每行依次为是名字、解题数量和罚时,中间用空格隔开。

每组测试数据后空一行。

输入样例:

1
3 3
Bob 5 50
Alice 4 46
John 5 48

输出样例:

John 5 48
Bob 5 50
Alice 4 46

代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB

Code

#include<bits/stdc++.h>
using namespace std;

struct student{
    string name;
    int num,time;
};

bool cmp(student& a,student &b){
    if(a.num == b.num)
        return a.time<b.time;
    return a.num>b.num;
}

int main(){
    int c;
    cin>>c;
    while(c--){
        int n,m;
        cin>>n>>m;
        student stu[n];
        for(int i=0;i<n;i++){
            cin>>stu[i].name>>stu[i].num>>stu[i].time;
        }
        sort(stu,stu+n,cmp);
        for(int i=0;i<m;i++){
            cout<<stu[i].name<<" "<<stu[i].num<<" "<<stu[i].time<<endl;
        }
        cout<<endl;
    }
    
    return 0;
}

7-3 一起过生日

分数 20

杭州电子科技大学附属小学有个优秀的传统,每隔一段时间,会给班里的近期过生日的同学举办一场生日 Party!老师会给出一个生日起止日期来确定生日 Party 的小寿星。

输入格式:

输入包含多组测试数据。

每组数据第一行,包括一个正整数 \(N(0 <= N <= 40)\),表示某个班的学生人数,接下来有 \(N\) 行数据,每行包含一个同学的姓名,以及出生年、月、日。

每组数据的最后一行,包括 \(4\) 个正整数 \(m1、d1、m2、d2\),分别表示生日 Party 的小寿星生日起止月和日(包含),其中 \(m1 <= m2\)

输出格式:

每组数据输出一行小寿星的名单(按照原名单的次序),每个名字后面跟一个空格。

输入样例:

5
Tom 2009 10 15
Kate 2010 7 20
David 2010 6 30
Kevin 2009 7 3
Sarah 2010 3 8
7 1 7 30

输出样例:

Kate Kevin 

代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB

Code

#include<bits/stdc++.h>
using namespace std;

struct student{
    string name;
    int y,m,d;
};



int main(){
    int n;

    while(cin>>n){
        student stu[n];
        for(int i=0;i<n;i++){
            cin>>stu[i].name>>stu[i].y>>stu[i].m>>stu[i].d;
        }
        int m1,d1,m2,d2;
        cin>>m1>>d1>>m2>>d2;
        bool selected;
        if(m1!=m2){
            for(int i=0;i<n;i++){
                selected=false;
                if(stu[i].m<m2 && stu[i].m>m1)  selected=true;
                if(stu[i].m==m2 && stu[i].d<=d2)    selected=true;
                if(stu[i].m==m1 && stu[i].d>=d1)    selected=true;
                if(selected){
                    cout<<stu[i].name<<" ";
                }
            }
        }else{
            if(d1>d2)   swap(d1,d2);
            for(int i=0;i<n;i++){
                if(stu[i].m==m1 && stu[i].d>=d1 && stu[i].d<=d2){
                    cout<<stu[i].name<<" ";
                }
            }
        }
        cout<<endl;
    }
    
    
    return 0;
}

7-4 杰克马抓牛

分数 15

Jack Ma 退休后过上了田园生活,他养了一群牛。

有一天有人告诉他一头牛逃跑了,牛现在的位置在 \(K\) 点,他现在处于 \(N\) 点。

假设他们都只能沿着他们所在的直线行走,Jack Ma 有两种行动方式:

  • 走路:在一分钟之内,从 \(X\) 点向前移动一个位置到 \(X + 1\),或者向后移动到 \(X - 1\)

  • 瞬移:在一分钟之内,从 \(X\) 点移动到 \(2 * X\) 点处。

假设牛是不知道已经被发现逃跑了,一直在原地未动,请问 Jack Ma 最少需要多少时间能追到牛。

输入格式:

输入包含多个测试数据。

每个测试数据包含两个整数 \(N, K(0 <= N, K <= 100,000)\) ,分别表示 Jack Ma 和牛在直线上的位置。

输出格式:

对于每组测试数据,请输出追到牛最少需要花费多少分钟。

每组数据输出一行。

输入样例:

5 17

输出样例:

4

代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB

Code

#include<bits/stdc++.h>
using namespace std;
const int maxa=200000;


int main(){
    int n,k;
    while(cin>>n>>k){
        queue<int> q;
        bool used[maxa];
        int depth[maxa];
        memset(used,false,sizeof(used));
        q.push(n);
        used[n]=true;
        depth[n]=0;
        while(!q.empty()){
            int now=q.front();
            q.pop();
            if(now==k){
                cout<<depth[now]<<endl;
                break;
            }
            if(now-1>=0 && !used[now-1]){
                q.push(now-1);
                used[now-1]=true;
                depth[now-1]=depth[now]+1;
            }
            if(now+1<maxa-1 && !used[now+1]){
                q.push(now+1);
                used[now+1]=true;
                depth[now+1]=depth[now]+1;
            }
            if(now*2<maxa && !used[now*2]){
                q.push(now*2);
                used[now*2]=true;
                depth[now*2]=depth[now]+1;
            }
        }
    }
    

    return 0;
}

7-5 小猫和老鼠

分数 10

小老鼠准备了 \(M\) 磅的猫粮,准备去和看守仓库的小猫做交易,因为仓库里有小老鼠喜欢吃的五香豆。

仓库有N个房间;

\(i\) 个房间有 \(J[i]\) 磅的五香豆,需要用 \(F[i]\) 磅的猫粮去交换;

需要指出的是:

  • 老鼠如果要和某个房间的小猫做交易,就必须交换该房间所有的五香豆!

  • 还有个特殊的情况,小老鼠有强迫症——它一定要把自己所有的猫粮都用完才行!

现在,请帮忙计算一下,在必须用完所有的猫粮的前提下,小老鼠通过交易最多能够得到多少磅的五香豆?

输入格式:

输入包含多组测试用例。

每组测试数据首先一行是 \(2\) 个非负整数 \(M\)\(N\),接着的 \(N\) 行,每行分别包含 \(2\) 个非负整数J[i]F[i],数据的具体含义详见题目描述。

输入数据以两个-1结束。

题目保证所有的数据都不超过\(1000\).

输出格式:

请计算并输出小老鼠最多能够得到的五香豆数量,如果不能满足小老鼠的强迫症,请输出-1;

每组数据输出一行。

输入样例:

5 3
7 2
4 3
5 2
20 3
25 18
24 15
15 10
-1 -1

输出样例:

11
-1

代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB

7-6 抗旱和救灾

分数 10

正所谓——“百年不遇年年遇”!

某年夏天,中国西南诸省再次出现了“百年不遇”的严重旱情!

由于灾情越来越严重,很多学校师生的用水困难已成为最急需解决的问题,而要给各学校提供用水,就必须先知道各学校是否与水库有道路相连。

刘二丁——国家防汛抗旱总指挥部总指挥,现在想请你编写一个程序,读入所有道路的信息,计算有多少学校没有路与水库相通。

同学们,好好学算法,为刘总指挥分忧~

输入格式:

输入有多组数据。

每组数据第一行包括两个正整数 \(n\)\(m(0<n<1000, 0<m<=(n*(n+1)/2)\)\(n\) 表示学校的数目,\(m\)表示道路的数目),学校用\(1\)\(n\)的整数编号,水库的编号永远记为\(0\)

接下来有m行,每行有两个数a和b,a和b用一个空格分开,表示a到b有一条路。

请处理到文件结束。

输出格式:

对于每组输入数据:

如果所有的学校均与水库相通,则请在一行内输出0;

如果有学校不通水库,则请输出与水库无路连接的学校个数;

每组数据的输出占一行。

输入样例:

4 4
0 1
0 2
1 2
2 3

输出样例:

1

代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB

Code

#include<bits/stdc++.h>
using namespace std;
const int maxa=200000;

void merge(int* array,int to,int from,int size){
    if(array[to]!=array[from]){
        int temp=array[from];
        for(int i=0;i<size;i++){
            if(array[i]==temp){
                array[i]=array[to];
            }
        }
    }
}

int main(){
    int n,m;
    while(cin>>n>>m){
        int school[n+1];
        for(int i=0;i<n+1;i++){
            school[i]=i;
        }
        
        int a,b;
        for(int i=0;i<m;i++){
            cin>>a>>b;
            merge(school,a,b,n+1);
            // if(a==0){
            //     merge(school,a,b,n);
            // }else if(b==0){
            //     merge(school,b,a,n);
            // }else{
            //     merge(school,a,b,n);
            // }
            // for(int i=0;i<n+1;i++){
            //     cout<<school[i]<<" ";
            // }
            // cout<<endl;
        }
        int count=0;
        for(int i=1;i<n+1;i++){
            if(school[i]!=school[0]){
                count++;
            }
        }
        cout<<count<<endl;
    }
    

    return 0;
}

ACM | ACM Test 240111
https://acm.nanyan.cc/posts/251c.html
作者
nanyan
发布于
2024年1月11日
许可协议