2020软院算法组新生周练 - 第六周

A.朝阳摆花

Problem Description

朝阳有n朵需要摆放的花,但是每朵花呢,高度都不一样,朝阳不喜欢相邻的花高度相差太多,这样会影响美感。
所以朝阳提出了一个“丑陋度”的概念,“丑陋度”意思为在一个摆放序列中,相邻花高度差的最大值。而且朝阳是一个完美主义者,所以他希望:
1.将这些花摆成首尾相接的圆形
2.为了美观,他希望摆放的花“丑陋度”最小

Input

多组输入,对于每组数据有:
输入一行一个整数n( 2 <= n <= 5000),表示有n朵花需要摆放
接下来输入第二行n个数表示花的高度h(1 <= h <= 10000000000)

output

输入最小的丑陋度

Same input

5
2 1 1 3 2
3
30 10 20

Same output

1
20

标程

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

long long h[5005];

int main(){
    int n;
    while(~scanf("%d",&n)){
        for(int i = 0 ; i < n ; ++i) scanf("%lld",&h[i]);
        sort( h ,h + n);
        long long i = 0,ans = h[1] - h[0];
        while(i+2 < n){
            ans = max(ans,h[i+2] - h[i]);
            i++;
        }
        printf("%lld\n",ans);
    }
}

B、朝阳爱奇数

Problem Description

在朝阳面前放着nn个数,这些数字既有奇数也有偶数,只不过朝阳对奇数情有独钟,他特别想让这些数都变成奇数。
现在朝阳获得了一种能力,他可以执行一种操作:每次选中一个偶数,然后把这个数除以2,例如现在有一个数组为[2,2,3],那么朝阳可以执行两次次操作,使得这个数组变为[1,1,3]。
朝阳现在想知道,对于任意的n个数,他最少需要操作多少次,使得这些数都变成奇数?

Input

多组输入,对于每组数据有:
输入一行一个整数n( 2 <= n <= 5000),表示有n个数
接下来输入第二行n个数a[0],a[1]...a[n-1],对于所有a[i](1 <= a[i] <= 100000000)

output

输出最少做多少次操作,将所有的数变成奇数

Same input

3
2 2 3
3
1 3 7

Same output

2
0

标程

#include<stdio.h>

int main(){
    int n;
    while(~scanf("%d",&n)){
        long long a,ans = 0;
        for(int i = 0 ; i < n ; ++i){
            scanf("%lld",&a);
            while(!(a & 1)){
                ++ans; a >>= 1;
            }
        }
        printf("%lld\n",ans);
    }
}

C、奶茶加珍珠

Problem Description

你有一个20元的餐券,这里共有n种饮品,你可以只买一种,也可以买多种,每种可以只买一杯,也可以买多杯(只要你的钱够)。

每杯饮品原本给予你的满足感和它的价格相同,但珍珠可以使一杯饮品给予你的满足感翻倍,加一份珍珠是2倍,加两份是4倍,加三份是8倍,以此类推。

你可以在任何一杯饮品甚至西瓜汁里加任意份数珍珠(只要你的钱够),每份珍珠2元。

你获得的满足感是你买到的所有饮品的满足感的和,请问你通过这张餐券最多能获得多少满足感。

Input

多组输入,每组输入共2行。

第1行:一个正整数n(1 <= n <= 20 ),表示饮品的种类数

第2行:n个由空格分开的正整数P[i] (2 <= p[i] <= 20),表示第i种饮品的价格

Output

对于每组数据,输出一行,一个正整数,表示你能获得的满足感的最大值

Same input

4
17 18 19 20

Same Output

36

标程

#include<bits/stdc++.h>
using namespace std;
int price,love;

int main(){
    int n;
    while(~scanf("%d",&n)){
        int ans = 0;
        for(int i = 0; i < n; i++){
            scanf("%d",&price);
            love = price;
              while(price < 19){
              love *= 2;price += 2;
            }
        ans = max(ans,love);
        }
    printf("%d\n",ans);
    }
}

D、niconiconi

Problem

图片说明

Input

多组输入,对于每组数据有:

依次给出等边三角形的3个顶点坐标A, B, C 和P点的二维几何坐标 (x,y) (0 <= |x|,|y| <= 10000)

保证P点在等边三角形内,包括边。

Output

如图,求P点到各边的距离和(s + t + u)。

只要你的答案与标准答案误差的绝对值在图片说明 以内都会算作正确。

Same input

0 0
10 0
5 8.66025403784
5 2.88675134595

Same output

8.66025403784

标程

#include<stdio.h>
#include<math.h>

double xa,ya,xb,yb,xc,yc,xp,yp;

int main(){
    while(~scanf("%lf%lf",&xa,&ya)){
        scanf("%lf%lf",&xb,&yb);
        scanf("%lf%lf",&xc,&yc);
        scanf("%lf%lf",&xp,&yp); 
        double s=sqrt((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb));
        double h= 0.5*sqrt(3)*s; 
        printf("%.6lf\n",h);
    }
    return 0;
}

D石头、剪刀、布

Problem

朝阳为了让白苒崇拜他,决定和白苒进行石头剪刀布游戏。
当然,普通的石头剪刀布根本吸引不到白苒,也无法展现朝阳高超的能力,所以朝阳想起了他在一本漫画中看到的规则,游戏规则如下:
两个人进行石头剪刀布大战,开始时会发给每个人n张牌,然后两人进行n次剪刀石头布大战,每一次两人分别选择自己的n张牌中的一张,打出,每张牌只能用一次。
朝阳这个游戏已经玩到了出神入化的地步,以至于他能猜到每一次白苒会出什么牌。请问在知道白苒每一轮出什么牌的情况下,朝阳最多能赢多少局比赛?
开始发给朝阳的n张牌里,有p1张石头牌,q1张剪刀牌,m1张布牌。
开始发给白苒的n张牌里,有p2张石头牌,q2张剪刀牌,m2张布牌。
请计算朝阳能赢的最多局数。

Input

多组输入

对于每组数据
第一行三个整数p1,q1,m1
第二行三个整数p2,q2,m2
含义如题所示,保证p1+q1+m1 == p2+q2+m2且(0=<p1,p2,q1,q2,m1,m2<=1e9)

Output

输出朝阳能赢的最多局数

Same input

3 0 0
0 0 3

Same output

0

标程

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll p1,p2,q1,q2,m1,m2;

int main(){
    while(~scanf("%lld%lld%lld",&p1,&q1,&m1)){
        scanf("%lld%lld%lld",&p2,&q2,&m2);
        printf("%lld\n",min(p1,q2)+min(q1,m2)+min(m1,p2));
    }
    return 0;
}
全部评论

相关推荐

05-12 11:09
已编辑
门头沟学院 后端
已注销:没必要放这么多专业技能的描述。这些应该是默认已会的,写这么多行感觉在凑内容。项目这块感觉再包装包装吧,换个名字,虽然大家的项目基本都是网上套壳的,但是你这也太明显了。放一个业务项目,再放一个技术项目。技术项目,例如中间件的一些扩展和尝试。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务