一、截绳子
题目描述
有 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;
}