哈尔滨工程大学第十四届程序设计竞赛(同步赛)H,N题题解

哈尔滨工程大学第十四届程序设计竞赛(同步赛)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;
}

链接

https://ac.nowcoder.com/acm/contest/642#question

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值