day11 蓝桥 algo_38、39、42、43、45、47

ALGO-38. 接⽔水问题!

问题描述
学校⾥里里有⼀一个⽔水房,⽔水房⾥里里⼀一共装有m 个⻰龙头可供同学们打开⽔水,每个⻰龙头每秒钟的 供⽔水量量相等,均
为1。 现在有n 名同学准备接⽔水,他们的初始接⽔水顺序已经确定。将这些同学按接⽔水顺序从1 到n 编
号,i 号同学的接⽔水量量为wi。接⽔水开始时,1 到m 号同学各占⼀一个⽔水⻰龙头,并同时打 开⽔水⻰龙头接⽔水。
当其中某名同学j 完成其接⽔水量量要求wj 后,下⼀一名排队等候接⽔水的同学k ⻢马上接替j 同学的位置开始接
⽔水。这个换⼈人的过程是瞬间完成的,且没有任何⽔水的浪费。即 j 同学第x 秒结束时完成接⽔水,则k 同学
第x+1 秒⽴立刻开始接⽔水。若当前接⽔水⼈人数n’不不⾜足m, 则只有n’个⻰龙头供⽔水,其它m−n’个⻰龙头关闭。 现
在给出n 名同学的接⽔水量量,按照上述接⽔水规则,问所有同学都接完⽔水需要多少秒。
输⼊入格式
第1 ⾏行行2 个整数n 和m,⽤用⼀一个空格隔开,分别表示接⽔水⼈人数和⻰龙头个数。 第2 ⾏行行n 个整数w1、w2、
……、wn,每两个整数之间⽤用⼀一个空格隔开,wi 表示i 号同 学的接⽔水量量。
输出格式
输出只有⼀一⾏行行,1 个整数,表示接⽔水所需的总时间。
样例例输⼊入
5 3
4 4 1 2 1
样例例输出
4
样例例输⼊入
8 4
23 71 87 32 70 93 80 76
样例例输出
163
输⼊入输出样例例 1 说明
第1 秒,3 ⼈人接⽔水。第1 秒结束时,1、2、3 号同学每⼈人的已接⽔水量量为1,3 号同学接完
⽔水,4 号同学接替3 号同学开始接⽔水。
第2 秒,3 ⼈人接⽔水。第2 秒结束时,1、2 号同学每⼈人的已接⽔水量量为2,4 号同学的已接
⽔水量量为1。
第3 秒,3 ⼈人接⽔水。第3 秒结束时,1、2 号同学每⼈人的已接⽔水量量为3,4 号同学的已接
⽔水量量为2。4 号同学接完⽔水,5 号同学接替4 号同学开始接⽔水。
第4 秒,3 ⼈人接⽔水。第4 秒结束时,1、2 号同学每⼈人的已接⽔水量量为4,5 号同学的已接
⽔水量量为1。1、2、5 号同学接完⽔水,即所有⼈人完成接⽔水。
总接⽔水时间为4 秒。
数据规模和约定
1 ≤ n ≤ 10000,1 ≤m≤ 100 且m≤ n;
1 ≤ wi ≤ 100。

思考:
类似于磁盘的算法
1、利用优先队列进行
2、每次同学接⽔水,都⾛走到需要排队时间最少的队伍前,每次有同学排队,需最少排队时间的队
都在变化
3、最后,队伍最⻓长的,就是接⽔水总时间~

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main() {
priority_queue<int, vector<int>, greater<int> > q;
int n, m, ans;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
int t;
scanf("%d", &t);
if (i <= m) q.push(t);
else {
int a = q.top();
q.pop();
q.push(a + t);
}
}
while (!q.empty()) {
ans = q.top();
q.pop();
}
cout << ans;
return 0;
}

ALGO-39. 数组排序去重


问题描述
  输⼊入10个整数组成的序列列,要求对其进⾏行行升序排序,并去掉重复元素。
输⼊入格式
  10个整数。
输出格式
  多⾏行行输出,每⾏行行⼀一个元素。
样例例输⼊入
2 2 3 3 1 1 5 5 5 5
样例例输出
1
2
3
5

#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
vector<int >v(10);
int main(){
	int n;
	for(int i=0;i<10;i++)
	{
		cin>>v[i];
	}
	sort(v.begin(),v.end());
	v.erase(unique(v.begin(),v.end()),v.end());
	for(int i=0;i<v.size();i++)
		cout<<v[i]<<endl;
	return 0;
}

ALGO-42. 送分啦

问题描述
  这题想得分吗?想,请输出“yes”;不不想,请输出“no”。
输出格式
  输出包括⼀一⾏行行,为“yes”或“no”。
分析:笑死。不想我做他干嘛

#include<iostream>
using namespace std;

int main(){
	cout<<"yes";
	return 0;
}

ALGO-43. A+B Problem

问题描述
  输⼊入A,B。
  输出A+B。
输⼊入格式
  输⼊入包含两个整数A,B,⽤用⼀一个空格分隔。
输出格式
  输出⼀一个整数,表示A+B的值。
样例例输⼊入
5 8
样例例输出
13
数据规模和约定
  -1,000,000,000<=A,B<=1,000,000,000。
 
好傻啊,这题目

#include<iostream>
using namespace std;

int main(){
	int a,b;
	cin>>a>>b;
	cout<<a+b;
	return 0;
}

ALGO-45. 调和数列列问题

问题描述
输⼊入⼀一个实数x,求最⼩小的n使得,1/2+1/3+1/4+…+1/(n+1)>=x。
输⼊入的实数x保证⼤大于等于0.01,⼩小于等于5.20,并且恰好有两位⼩小数。你的程序要能够处理理多组数
据,即不不停地读⼊入x,如果x不不等于0.00,则计算答案,否则退出程序。
输出格式为对于⼀一个x,输出⼀一⾏行行n card(s)。其中n表示要计算的答案。
输⼊入格式
分⾏行行输⼊入x的具体数值
输出格式
分⾏行行输出n的数值,格式为n card(s)
样例例输⼊入
1.00
3.71
0.04
5.19
0.00
样例例输⼊入
3 card(s)
61 card(s)
1 card(s)
273 card(s)

#include<iostream>
#include<cstdio>
using namespace std;

double x;

int main(){
	while(scanf("%lf",&x)!=0){
		int i=2;
		double sum=0.00;
		while(i){
			sum=sum+1.0/i;
			if(sum>=x)
				{
					printf("%d card(s)\n",i-1); 
					break;
				}
			i++;
		}
		
	}
	return 0;
}

ALGO-46. Hanoi问题!


问题描述
如果将课本上的Hanoi塔问题稍做修改:仍然是给定N只盘⼦子,3根柱⼦子,但是允许每次最多移动相邻
的M只盘⼦子(当然移动盘⼦子的数⽬目也可以⼩小于M),最少需要多少次?
例例如N=5,M=2时,可以分别将最⼩小的2个盘⼦子、中间的2个盘⼦子以及最⼤大的⼀一个盘⼦子分别看作⼀一个整
体,这样可以转变为N=3,M=1的情况,共需要移动7次。
输⼊入格式
输⼊入数据仅有⼀一⾏行行,包括两个数N和M(0<=M<=N<=8)
输出格式
仅输出⼀一个数,表示需要移动的最少次数
样例例输⼊入
5 2
样例例输出
7

#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n, m, ans = 0;
cin >> n >> m;
if (n % m == 0) n /= m;
else n = n / m + 1;
cout << (int) pow(2, n) - 1;
return 0;
}

ALGO-47. 蜜蜂⻜飞舞

问题描述
“两只⼩小蜜蜂呀,⻜飞在花丛中呀……”
话说这天天上⻜飞舞着两只蜜蜂,它们在跳⼀一种奇怪的舞蹈。⽤用⼀一个空间直⻆角坐标系来描述这个世界,
那么这两只蜜蜂初始坐标分别为(x1,y1,z1),(x2,y2,z2)  。在接下来它们将进⾏行行n次⻜飞⾏行行,第i次⻜飞⾏行行
两只蜜蜂分别按照各⾃自的速度向量量⻜飞⾏行行ti个单位时间。对于这⼀一现象,玮玮已经观察了了很久。他很想
知道在蜜蜂⻜飞舞结束时,两只蜜蜂的距离是多少。现在他就求教于你,请你写⼀一个程序来帮他计算这
个结果。
输⼊入格式
第⼀一⾏行行有且仅有⼀一个整数n,表示两只蜜蜂将进⾏行行n次⻜飞⾏行行。
接下来有n⾏行行。
第i⾏行行有7个⽤用空格分隔开的整数ai,bi,ci,di,ei,fi,ti  ,表示第⼀一只蜜蜂单位时间的速度向量量为(ai,bi,ci)
,第⼆二只蜜蜂单位时间的速度向量量为(di,ei,fi) ,它们⻜飞⾏行行的时间为ti 。
最后⼀一⾏行行有6个⽤用空格分隔开的整数x1,y1,z1,x2,y2,z2,如题所示表示两只蜜蜂的初始坐标。
输出格式
输出仅包含⼀一⾏行行,表示最后两只蜜蜂之间的距离。保留留4位⼩小数位。
样例例输⼊入
Sample 1
1
1 1 1 1 -1 1 2
3 0 1 2 0 0
Sample 2
3
1 1 1 1 -1 1 2
2 1 2 0 -1 -1 2
2 0 0 -1 1 1 3
3 0 1 2 0 0
样例例输出
Sample 1
4.2426
Sample 2
15.3948

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

int main(){
	int n;
	cin>>n;
	int tx1,ty1,tz1,tx2,ty2,tz2,t;
	int x1=0,y1=0,z1=0,x2=0,y2=0,z2=0;
	while(n--){
		cin>>tx1>>ty1>>tz1>>tx2>>ty2>>tz2>>t;
		x1+=tx1*t;
		y1+=ty1*t;
		z1+=tz1*t;
		x2+=tx2*t;
		y2+=ty2*t;
		z2+=tz2*t;
	}
	int x3,y3,z3,x4,y4,z4;
	cin>>x3>>y3>>z3>>x4>>y4>>z4;
	x1+=x3;
	y1+=y3;
	z1+=z3;
	x2+=x4;
	y2+=y4;
	z2+=z4;
	double sum=sqrt(pow(x1-x2,2)+pow(y1-y2,2)+pow(y1-y2,2));
	cout<<fixed<<setprecision(4)<<sum;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值