山东大学-2024 程序设计思维与实践week 4 截绳子+复印机+商店+游戏

一、截绳子

题目描述
有 n 段绳子,长短不一。现在要从中截出 段长度相同的绳子。当然,一段绳子可以截出来多段绳子。截出来的绳子最长是多少?


输入格式


第一行两个整数n和k(l < n,k < 105)
接下来 n 行,每行有一个整数 ai(l < a;< 10),代表每根绳子的长度

输出格式
个数,代表最长长度。相对误差或绝对误差不超过 10-6


测试样例


样例 1


输入:
4 11
289.5
802
743
457
539

输出:

200.5

#include<bits/stdc++.h>

using namespace std;

bool cut(double l,vector<double> &v,int k){
    int count=0;
    for(auto &i:v){
        count+=(int)i/l;
    }
    if(count>=k)return true;
    return false;
}

int main() {
    int n,k;cin>>n>>k;
    vector<double> v;

    double temp;

    for(int i=0;i<n;i++){
        cin>>temp;
        v.push_back(temp);
    }
    double low=0,up=1e7;
    while(up-low>1e-6){
        if(cut((up+low)/2,v,k)){
            low=(up+low)/2;
        }
        else{
            up=(up+low)/2;
        }
    }
    cout<<up;

    return 0;
}

二、复印机

题目描述
有一份原稿,需要复印出 n 份复印件出来,有两合复印机,一合可以每 秒复印出一份,另一台可以每 秒复印出一份。现在想知道至少需要多久才能复印完成?
提示:复印件也可以被复印


输入格式
行三个整数n,z和y(l < n < 2 x 10,1 < t,y < 10)


输出格式
个整数,代表复印 n 份的最短时间


测试样例
样例 1
输入:

4 1 1
输出:
3
样例2
输入:

5 1 2
输出:
4

#include<bits/stdc++.h>
using namespace std;
int main() {
    int n,x,y;cin>>n>>x>>y;
    int k=min(x,y);
    n--;
    int xy=x*y;
    int b=n/(x+y);
    int count=0;
    int time=0;
    while(count<n%(x+y)){
        time++;
        if(!(time%x)){
            count++;
        }
        if(!(time%y)){
            count++;
        }
    }
    cout<<b*xy+time+k;
    return 0;
}

三、商店

题目描述
条街上有 个商店,在第个商店,可以以 a; 的价格买入一个商品,也可以以;的价格卖出一个商品。商品很沉,最多只能同时拿着1个商品在街上走。现在按照给定顺序依次访问所有商店,那么,最大收益是多少?在获得最大收益的前提下,最少交易次数是多少?
输入格式
第一行一个整数 T(1 < T< 5,代表测试用例个数下面工组数据,其中每一组数据都占两行,其中
第一行一个整数 n(l < n < 105),代表商店个数
下面一行n 个整数,其中第个数为ai(0 < a< 2147483648),代表在第个商店可以买入或卖出商品的价格
输出格式
对于每个例子,输出一行两个整数,分别代表最大收益和获得最大收益的前提下最少的交易次数
测试样例

样例1

输入:

1

5

9 10 7 6 8

输出:

3 4

#include<bits/stdc++.h>
using namespace std;
int main() {
    int T;cin>>T;
    int n;
    int count=0;
    unsigned long long P=0;
    int temp;
    vector<long long> v;
    vector<long long> vf;
    while(T--){
        cin>>n;
        count=0;
        P=0;
        for(int i=0;i<n;i++){
            cin>>temp;
            v.push_back(temp);
        }
        for(int i=0;i<n-1;i++){
            vf.push_back(v[i+1]-v[i]);
        }
        for(auto &i:vf){
            if(i>0){
                P+=i;
            }
        }
        int flag=-1;
        if(vf[0]>0){
            count++;
            flag=vf[0];
        }
        for(int i=1;i<n-1;i++){
            if((flag>0&&vf[i]<0)||(flag<0&&vf[i]>0)){
                flag=vf[i];
                count++;
            }
        }
        if(flag>=0){
            count++;
        }
        cout<<P<<" "<<count<<endl;
        v.erase(v.begin(),v.end());
        vf.erase(vf.begin(),vf.end());
    }
    return 0;
}

四、游戏

题目描述
Alice 和 Bob 在做游戏,Alice 写下了 n 个不同的数字,又选取了数字K。Alice 让 Bob 进行一些操作,每次操作如下:
1.选取两个整数 t,y ,它们的差值不超过 K ,即 - y <= K
2.删除它们中较小的数字
Bob 的任务是,尽可能多的进行这样的操作。当然 Bob 有可能一次操作都做不了。那么,Bo 最多可以进行多少次操作?
输入格式


第一行两个整数n,K(l < n < 1051< K <1012)
下面一行 n 个整数,其中第个数为 a;(0 < a; < 1012),代表 Alice 写下的数字


输出格式
输出一个整数,代表 Bob 最多可以进行的操作次数


测试样例
样例 1
输入:

5 1

3 7 4 1 5
输出:

2

#include<bits/stdc++.h>
using namespace std;
int main() {
    long long n,K;cin>>n>>K;
    vector<long long> v;
    long long temp;
    int sum=0;
    vector<int> vf;
    for(int i=0;i<n;i++){
        cin>>temp;
        v.push_back(temp);
        vf.push_back(0);
    }
    sort(v.begin(),v.end());
    for(int i=0;i<n-1;i++){
        if(v[i+1]-v[i]<=K){
            vf[i]=1;
            sum++;
        }
    }
    cout<<sum<<endl;
    return 0;
}

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值