黎子卿 发表于 2023-11-30 22:18:18

求代码

C++
描述
仙境的居民们决定举办一场程序设计区域赛。裁判委员会完全由自愿组成,他们承诺要组织一次史上最公正的比赛。他们决定将选手的电脑用星形拓扑结构连接在一起,即将它们全部连到一个单一的中心服务器。为了组织这个完全公正的比赛,裁判委员会主席提出要将所有选手的电脑等距离地围绕在服务器周围放置。

为购买网线,裁判委员会联系了当地的一个网络解决方案提供商,要求能够提供一定数量的等长网线。裁判委员会希望网线越长越好,这样选手们之间的距离可以尽可能远一些。

该公司的网线主管承接了这个任务。他知道库存中每条网线的长度(精确到厘米),并且只要告诉他所需的网线长度(精确到厘米),他都能够完成对网线的切割工作。但是,这次,所需的网线长度并不知道,这让网线主管不知所措。

你需要编写一个程序,帮助网线主管确定一个最长的网线长度,并且按此长度对库存中的网线进行切割,能够得到指定数量的网线。

输入
第一行包含两个整数N和K,以单个空格隔开。N(1 <= N <= 10000)是库存中的网线数,K(1 <= K <= 10000)是需要的网线数量。
接下来N行,每行一个数,为库存中每条网线的长度(单位:米)。所有网线的长度至少1m,至多100km。输入中的所有长度都精确到厘米,即保留到小数点后两位。
输出
网线主管能够从库存的网线中切出指定数量的网线的最长长度(单位:米)。必须精确到厘米,即保留到小数点后两位。
若无法得到长度至少为1cm的指定数量的网线,则必须输出“0.00”(不包含引号)。
样例输入
4 11
8.02
7.43
4.57
5.39
样例输出
2.00

FishC_GPT 发表于 2023-11-30 22:18:47

题目要求确定一个最长的网线长度,使得切割后的网线数量能够满足给定的数量。我们可以使用二分查找的方法来逼近最长的网线长度。

具体的算法步骤如下:
1. 读取输入的N和K,分别表示网线的数量和需要的数量。
2. 读取所有网线的长度,并将它们存储在一个数组中。
3. 定义两个变量start和end,分别表示二分查找的起始位置和结束位置。初始时,start为0,end为最长的网线长度。
4. 使用循环进行二分查找,直到start大于end为止。
   - 在每一次循环中,计算出网线的中间长度mid,并初始化一个计数器count为0,表示当前长度下切割网线的数量。
   - 遍历所有网线,如果某条网线的长度大于等于mid,则将计数器加1。
   - 如果计数器大于等于K,则说明当前的长度mid可以满足需求,更新start为mid+1。
   - 否则,说明当前的长度mid不能满足需求,更新end为mid-1。
5. 输出end作为最长的网线长度。

以下是C++的实现代码:

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

int main() {
    int N, K;
    cin >> N >> K;

    vector<int> lengths(N);
    for (int i = 0; i < N; i++) {
      cin >> lengths;
    }

    int start = 0;
    int end = *max_element(lengths.begin(), lengths.end());

    while (start <= end) {
      int mid = start + (end - start) / 2;
      int count = 0;

      for (int i = 0; i < N; i++) {
            if (lengths >= mid) {
                count++;
            }
      }

      if (count >= K) {
            start = mid + 1;
      } else {
            end = mid - 1;
      }
    }

    cout << end << endl;

    return 0;
}

这段代码首先读取输入的N和K,并将所有网线的长度存储在一个vector中。然后使用二分查找的方法,逼近最长的网线长度。最后输出结果。

注意,这里使用了`<algorithm>`库中的`max_element`函数来获取vector中的最大值。要使用该函数,需要包含该头文件。

希望能够帮助到你!

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

黎子卿 发表于 2023-11-30 22:20:14

FishC_GPT 发表于 2023-11-30 22:18
题目要求确定一个最长的网线长度,使得切割后的网线数量能够满足给定的数量。我们可以使用二分查找的方法来 ...

编译错误

FishC_GPT 发表于 2023-11-30 22:20:32

黎子卿 发表于 2023-11-30 22:20
编译错误

非常抱歉,可能是我在之前的回答中遗漏了一些代码。以下是完整的C++代码:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int N, K;
    cin >> N >> K;
    vector<int> lengths(N);
    for (int i = 0; i < N; i++) {
      cin >> lengths;
    }
   
    int start = 0;
    int end = *max_element(lengths.begin(), lengths.end());
    int result = 0;
   
    while (start <= end) {
      int mid = start + (end - start) / 2;
      int count = 0;
      
      for (int i = 0; i < N; i++) {
            count += lengths / mid;
      }
      
      if (count >= K) {
            start = mid + 1;
            result = mid;
      } else {
            end = mid - 1;
      }
    }
   
    cout << result << endl;
   
    return 0;
}

请注意,这段代码使用了`vector`和`algorithm`标准库。确保在编译时链接这些库。如果仍然有编译错误,请提供更具体的错误信息,以便我更好地帮助您。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

渔村暮火 发表于 2023-12-1 14:06:51

代码实现如下
#include <iostream>
#include <stdio.h>
#include <vector>
#include <stdbool.h>
using namespace std;

int main(int argc, char const *argv[])
{
    int N,K,stand = 0;
    cin >> N >> K;
    vector<float> lengths(N);
    float all_len = 0;
    float short_len = 0;
    float standlen = 0;
    bool flag = true;
    for (int i = 0; i < N; i++) {
      cin >> lengths;
      all_len += lengths;
      if(short_len > lengths || short_len <= 0)
      {
            short_len = lengths;
      }
      
    }
    if(all_len/K > short_len)
    {
      standlen = short_len;
    }
    else
    {
      standlen = all_len/K;
    }
    while ((stand < K)&&(standlen >= 0))
    {
      stand = 0;
      for (int i = 0; i < N; i++)
      {
            stand += lengths/standlen;
      }
      standlen -= 0.01;
    }
    if(stand >= K)
    {
      printf("%0.2f\n",standlen+0.01);
    }
    else
    {
      printf("0.00\n");
    }
   
    return 0;
}
页: [1]
查看完整版本: 求代码