哈尔滨工程大学第十四届程序设计竞赛(同步赛)H,N题题解
H题 小蚂蚁过马路
链接:https://ac.nowcoder.com/acm/contest/642/H
来源:牛客网
题目描述
共 有 n(1<=n<=1e15) 只 小 蚂 蚁 准 备 从 城 市 1 穿 梭 到 城 市 K(1<=K<=1e5) ,路线是从城市 1 出发,到城市 2,再到城市 3…最后到城市 K,一只蚂蚁花费 1 个单位时间从城市 i 到城市 i+1,但同一时间从城市 i 到城市 i+1 最多允许通过 a[i]只小蚂蚁,请问 n 只蚂蚁全到城市 K 所需要的时间。
输入描述:
第一行一个整数T(T <=6),表示数据组数。在每组输入数据中,第一行有2个正整数,n(n <= 1e15),K(2<=K<=1e5),分别表示小蚂蚁的数量和城市的数量。第二行中有K - 1个正整数a[i](a[i] <= 1e15),表示从城市i到城市i+1同一时间最多能通过几只小蚂蚁。
输出描述:
对于每组数据,输出一个数ans,表示所有蚂蚁到达城市K所需要的时间。
输入
2
16 3
6 5
15 3
6 5
输出
5
4
说明
第二组样例,第一个单位时间有6只蚂蚁从城市1到城市2,第二个单位时间有5只城市2的蚂蚁到城市3,同时又有6只蚂蚁从城市1到城市2,此时,有3只蚂蚁在城市1,7只蚂蚁在城市2,5只蚂蚁在城市3,第3个单位时间里,3 只城市1的蚂蚁到达城市2,5只城市2的蚂蚁到达城市3,此时,有0只蚂蚁在城市1,5只蚂蚁在城市2,10只蚂蚁在城市3,第四个单位时间所有蚂蚁都可以到达城市3。
我们通过例子可以知道,蚂蚁通过的时间与城市通过最少的蚂蚁数有关。
假设时间为 t,我们可以得到:
if(n / min(a[1],a[2]) ){
//如果蚂蚁数能整除通过城市最少的蚂蚁数,
//那么时间等于蚂蚁数除以通过城市最少的蚂蚁数+城市数-2个城市数
t = n / min(a[1],a[2] ) + k - 2;
}else{
//如果蚂蚁数不能整除通过城市最少的蚂蚁数,
//那么时间等于蚂蚁数除以通过城市最少的蚂蚁数+城市数-2个城市数 + 1
//因为剩下的蚂蚁还需要通过一个单位时间
t = n / min(a[1],a[2] ) + k - 2 + 1;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--){
long long n, k;
cin >> n >> k;
long long a[k - 1];
for(int i = 0; i < k -1; i++)
cin >> a[i];
sort(a, a + k - 1);
if(n % a[0]){
cout << n / a[0] + k - 2 + 1 <<endl;
}else {
cout << n / a[0] + k -2 <<endl;
}
}
return 0;
}
N题 苹果项链
链接:https://ac.nowcoder.com/acm/contest/642/N
来源:牛客网
题目描述
大美门口那棵树上的苹果有两种颜色:金和银。金苹果的数量是 n,每个苹果都有它的 id(id 从 1 到 n)和不同的重量(g[i])。银苹果的数量是 n,每个苹果都有它的 id(id 从 1 到 n)和不同的重量(s[i])。现在你需要用这些苹果来串一条项链。第一个要求是项链的颜色必须是金银相间的(意思是一个金苹果接一个银苹果,一个银苹果接一个金苹果,一个接一个…)。第二个要求是项链中的所有金苹果的重量应该按降序排列,银苹果也是降序。你能告诉我这条项链的 id 吗?这条项链的 id 是构成这条项链的金苹果和银苹果的 id 组合。而且,第一个一定是金苹果。
输入描述:
第一行一个整数T(T <=50),表示数据组数。在每组输入数据中,第一行有一个正整数,n(n<= 1000)。第二行中有n个正整数g[i](g[i] <= 1000),是n个金苹果的重量。第三行中有n个正整数s[i](s[i] <= 1000),是n个银苹果的重量。
输出描述:
对于每组数据,输出项链的id,每两个数中间有一个空格。示例1
输入
4
1 2 3 4
2 5 1 3
5
2 5 3 4 1
1 2 3 4 5
输出
4 2 3 4 2 1 1 3
2 5 4 4 3 3 1 2 5 1
说明
对于第一个样例,金苹果选最大重量的(第四个)放在项链的第一个位置,银苹果选最大重量的(第二个)放在项链的第二个位置……
通过图我们更加理解题意:
题意就是说金银两种苹果,我们根据重量从大到小排序,每一个苹果都有ID号,输出依次按金银苹果输出,输出的是对应苹果的ID号,所以我们想到用结构体来实现,存储I苹果D号和重量,然后进行排序,按金银苹果依次输出ID号就可以。
#include<bits/stdc++.h>
using namespace std;
typedef struct pg{
int id;
int w;
}PG;
bool cmp(PG a, PG b){
return a.w > b.w;
}
int main()
{
int t;
cin >> t;
while(t--){
int n;
cin >> n;
PG pgj[n], pgy[n];
for(int i = 0; i < n; i++){
pgj[i].id = i+1;
cin >> pgj[i].w;
}
for(int i = 0; i < n; i++){
pgy[i].id = i+1;
cin >> pgy[i].w;
}
sort(pgj, pgj + n, cmp);
sort(pgy, pgy + n, cmp);
for(int i = 0; i < n; i++){
cout << pgj[i].id << " ";
cout << pgy[i].id << " ";
}
cout << endl;
}
return 0;
}