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; }