太戈编程 51~80题目答案

本文介绍了51到80道编程题目,涵盖算法、数据结构和逻辑推理等多个方面,包括水房接水问题、最大牧场面积计算、瑞士轮赛制排名、矩阵分值最小化等复杂问题。每个题目详细阐述了输入输出格式及样例,旨在锻炼和提升编程思维和问题解决能力。
摘要由CSDN通过智能技术生成

注:如果某代码没有AC,在下面留言标题号找我

上一篇(31~50)是不是还没过瘾啊,这次我又来了hh

51

题目描述

学校里有一个水房,水房里一共装有 m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为 1 现在有 n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从 1到 n 编号,i 号同学的接水量为 wi。接水开始时,1 到 m 号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学 j 完成其接水量要求 wj后,下一名排队等候接水的同学 k马上接替 j 同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即j 同学第 x 秒结束时完成接水,则 k 同学第 x+1 秒立刻开始接水。若当前接水人数n不足 m,则只有n个龙头供水,其它 m−n个龙头关闭 现在给出 n 名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒

输入输出格式

输入格式

输入文件water.in
第 1 行 2 个整数n(1<=n<=10000)和 m(1<=m<=100),分别表示接水人数和龙头个数
第 2 行 n 个整数 w1、w2、……、wn(<=100),表示 i 号同学的接水量

输出格式

输出文件water.out
1 个整数,表示接水所需的总时间

输入输出样例

输入样例#1:复 制

8 4 
23 71 87 32 70 93 80 76

输出样例#1:复 制

163

输入样例#2:复 制

输出样例#2:复 制

输入样例#3:复 制

输出样例#3:复 制

说明

鸟啼花发柳含烟,掷却风光忆少年  更上高楼望江水,故乡何处一归船

#include<bits/stdc++.h>
using namespace std;
int n,m;
multiset<int> s;
int main(){
	freopen("water.in","r",stdin);
	freopen("water.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=m;i++) s.insert(0);
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		int t=*s.begin();
		s.erase(s.begin());
		s.insert(t+x);
	}
	cout<<*s.rbegin();
	return 0;
}

52

题目描述

和所有人一样,奶牛喜欢变化。它们正在设想新造型的牧场。奶牛建筑师lester想建造围有漂亮白色栅栏的三角形牧场。她拥有N(3≤N≤40)块木板,每块的长度Li(1≤Li≤40)都是整数,她想用所有的木板围成一个三角形使得牧场面积最大 请帮助lester构造这样的牧场,并计算出这个最大牧场的面积

输入输出格式

输入格式

第1行一个整数N,第2行包含N整数,即是木板长度

输出格式

一个整数:最大牧场面积乘以100然后舍尾的结果。如果无法构建,输出-1

输入输出样例

输入样例#1:复 制

5
1 1 3 3 4

输出样例#1:复 制

692

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

耕犁千亩实千箱,力尽筋疲谁复伤 但愿众生皆得饱,不辞羸病卧残阳

#include<bits/stdc++.h>
using namespace std;
int n,a[41],ans=-1;
void wash(){
    for(int i=1;i<=n;i++){
        int t=rand()%n;
        a[0]=a[t];
        a[t]=a[i];
        a[i]=a[0];
    }
}
int hl(double aa,double bb,double cc){
    if(aa+bb>cc&&bb+cc>aa&&aa+cc>bb){
        double p=(aa+bb+cc)/2;
        return trunc(sqrt(p*(p-aa)*(p-bb)*(p-cc))*100);
    }
    else return -1;
}
void work(){
    int p[3],pos;
    p[0]=a[1];p[1]=a[2];p[2]=a[3];
    for(int i=4;i<=n;i++){
        int min=0x7fffffff;
        for(int j=0;j<=2;j++){
            if(min>p[j]){
                min=p[j];
                pos=j;
            }
        }
        p[pos]+=a[i];
    }
    ans=max(ans,hl(p[0],p[1],p[2]));
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=10000;i++){
        wash();
        work();    
    }
    cout<<ans;
    return 0;
}

53

题目描述

在双人对决的竞技性比赛,如乒乓球、羽毛球、国际象棋中,最常见的赛制是淘汰赛和循环赛。前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高。后者的特点是较为公平,偶然性较低,但比赛过程往往十分冗长 本题中介绍的瑞士轮赛制,因最早使用于1895年在瑞士举办的国际象棋比赛而得名。它可以看作是淘汰赛与循环赛的折衷,既保证了比赛的稳定性,又能使赛程不至于过长 2*N 名编号为1~2N的选手共进行R轮比赛。每轮比赛开始前,以及所有比赛结束后,都会按照总分从高到低对选手进行一次排名。选手的总分为第一轮开始前的初始分数加上已参加过的所有比赛的得分和。总分相同的,约定编号较小的选手排名靠前 每轮比赛的对阵安排与该轮比赛开始前的排名有关:第1名和第2名、第3名和第4名……第2N–1名和第2N名,各进行一场比赛。每场比赛胜者得1分,负者得 0 分。也就是说除了首轮以外,其它轮比赛的安排均不能事先确定,而是要取决于选手在之前比赛中的表现 现给定每个选手的初始分数及其实力值,试计算在R 轮比赛过后,排名第 Q 的选手编号是多少。我们假设选手的实力值两两不同,且每场比赛中实力值较高的总能获胜

输入输出格式

输入格式

输入文件swiss.in
第一行是三个正整数N (≤100000)、R (≤50)、Q (≤2N),每两个数之间用一个空格隔开,表示有2*N名选手、R轮比赛,以及我们关心的名次Q

第二行是2*N 个非负整数s1, s2, …, s2N,每两个数之间用一个空格隔开,其中 si 表示编号为i 的选手的初始分数。 第三行是2*N 个正整数w1 , w2 , …, w2N,每两个数之间用一个空格隔开,其中 wi 表示编号为i 的选手的实力值

输出格式

输出文件swiss.out
一个整数,即R轮比赛结束后,排名第Q的选手的编号

输入输出样例

输入样例#1:复 制

2 4 2 
7 6 6 7 
10 5 20 15

输出样例#1:复 制

1

输入样例#2:

输出样例#2:

输入样例#3:

输出样例#3:

说明

#include<bits/stdc++.h>
using namespace std;
long long n,r,q;
struct competitor{
    long long power;
    long long point;
    long long num;
};
competitor a[200005],win[200005],lost[200005];
long long kwin,klost;
bool cmp(competitor c,competitor b){
    if(c.point==b.point) return c.num<b.num;
    else return c.point>b.point;
}
int main(){
  	freopen("swiss.in","r",stdin);
  	freopen("swiss.out","w",stdout);
    cin>>n>>r>>q;
    n=2*n;
    for(int i=0;i<n;i++){
        cin>>a[i].point;
        a[i].num=i+1;
    }
    for(int i=0;i<n;i++) cin>>a[i].power;
    sort(a+0,a+n,cmp);
    while(r--){
        for(int i=0;i<n-1;i=i+2){
            if(a[i].power>a[i+1].power){
                a[i].point++;
                win[kwin]=a[i];
                lost[klost]=a[i+1];
                klost++;
                kwin++;
            }
            else{
                a[i+1].point++;
                win[kwin]=a[i+1];
                lost[klost]=a[i];
                klost++;
                kwin++;
            }
        }
        merge(win+0,win+kwin,lost+0,lost+klost,a,cmp);
        klost=0;
        kwin=0;
    }
    cout<<a[q-1].num<<endl;
    return 0;
}

54

题目描述

从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行列相对顺序)称为原矩阵的一个子矩阵。

9

3

3

3

9

9

4

8

7

4

1

7

4

6

6

6

8

5

6

9

7

4

5

6

1

例如,此矩阵中选取第2、4行和第2、4、5列交叉位的元素得到一个2*3子矩阵

4

7

4

8

6

9

矩阵的分值=矩阵中每一对相邻元素之差的绝对值之和。

给定一个n行m列的正整数矩阵,请你从这个矩阵中选出一个r行c列的子矩阵,使得这个子矩阵的分值最小,并输出这个分值

输入输出格式

输入格式

输入文件为submatrix.in
第一行包含用空格隔开的四个整数n,m,r,c,意义如问题描述中所述,每两个整数之间用一个空格隔开。n,m<=16
接下来的n行,每行包含m个整数,表示问题描述中那个n行m列的矩阵(值<=1000)

输出格式

输出文件为submatrix.out
1个整数,表示满足题目描述的子矩阵的最小分值

输入输出样例

输入样例#1:复 制

5 5 2 3
9 3 3 3 9
9 4 8 7 4
1 7 4 6 6
6 8 5 6 9
7 4 5 6 1

输出样例#1:复 制

6

输入样例#2:


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值