0036-最多组团数
题目描述
用数组代表每个人的能力
一个比赛活动要求 参赛团队的最低能力值为N
每个团队可以由一人或者两人组成
且一个人只能参加一个团队
计算出最多可以派出多少只符合要求的队伍
输入描述
5
3 1 5 7 9
8
第一行代表总人数,范围 1~500000
第二行数组代表每个人的能力
数组大小范围 1~500000
元素取值范围 1~500000
第三行数值为团队要求的最低能力值
1~500000
输出描述
3
最多可以派出的团队数量
样例
示例一
输入
5
3 1 5 7 9
8
输出
3
说明 3、5组成一队 1、7一队 9自己一队 输出3
输入
7
3 1 5 7 9 2 6
8
输出
4
输入
3
1 1 9
8
输出
1
C++ 代码
//
// Created by HANWENKE on 2022-09-20.
//
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;
int main(){
int n;//表示有几个人
cin>>n;
vector<int>arr;
arr.reserve(n);
string temp;
cin.sync();
cin.clear();
getline(cin,temp);
istringstream stemp(temp);
int t;
while(stemp>>t){
arr.push_back(t);
}
cin.sync();
cin.clear();
int pow;
cin>>pow;
sort(arr.begin(),arr.end());
//找到数组中第一个大于pow的值--然后给一个新的数组
auto p= lower_bound(arr.begin(),arr.end(),pow);
vector<int>arr2;
for(auto it=arr.begin();it<p;it++){
arr2.push_back(*it);
}
int res=arr.size()-arr2.size();
int i=0,j=arr2.size()-1;
while(i<j){
if(arr2[i]+arr2[j]>=pow){
i++;
j--;
res++;
}else{
i++;
}
}
cout<<res;
return 0;
}
0037-作业总时长
题目描述
一个工厂有m条流水线
来并行完成n个独立的作业
该工厂设置了一个调度系统
在安排作业时,总是优先执行处理时间最短的作业
现给定流水线个数m
需要完成的作业数n
每个作业的处理时间分别为 t1,t2…tn
请你编程计算处理完所有作业的耗时为多少
当n>m时 首先处理时间短的m个作业进入流水线其他的等待
当某个作业完成时,
依次从剩余作业中取处理时间最短进入处理
输入描述
第一行为两个整数(采取空格分隔)
分别表示流水线个数m和作业数n
第二行输入n个整数(采取空格分隔)
表示每个作业的处理时长 t1,t2…tn 0<m,n<100 0<t1,t2…tn<100
输入描述
输出处理完所有作业的总时长
样例
输入
3 5
8 4 3 2 10
输出
13
说明
先安排时间为2,3,4的三个作业
第一条流水线先完成作业
调度剩余时间最短的作业8
第二条流水线完成作业
调度剩余时间最短的作业10
总共耗时 就是二条流水线完成作业时间13(3+10)
输入
3 9
1 1 1 2 3 4 6 7 8
输出
13
C++代码
//
// Created by HANWENKE on 2022-09-20.
//
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;
int main(){
string sin;
getline(cin,sin);
vector<int>arr;
int temp;
istringstream stemp(sin);
while(stemp>>temp){
arr.push_back(temp);
}
//arr[0]表示有几条流水线\arr[1]表示有几个独立的作业
vector<int>arr2;
//输入n个整数--每个作业的处理时常
cin.sync();
cin.clear();
getline(cin,sin);
istringstream s2(sin);
while(s2>>temp){
arr2.push_back(temp);
}
//要优先执行时间最短的作业--所以先排序
sort(arr2.begin(),arr2.end());
//如果处理的任务时小于流水线的个数---说明可以一次性处理完--时间为任务最大的时间
if(arr[1]<=arr[0]){
cout<<arr2[arr2.size()-1];
return 0;
}
//先让流水线上充满任务
vector<int>arr3(arr[0]);
for(int i=0;i<arr[0];i++){
arr3[i]=arr2[i];
}
auto it=arr3.begin();
for(int i=arr[0];i<arr2.size();i++){
//从第一个任务开始--一次给每个流水线加上对应的任务
if(it==arr3.end()){
it=arr3.begin();
}
*it+=arr2[i];
it++;
}
int maxtime=INT32_MIN;
//求出流水线上--最耗时的那个任务输出
for(int i=0;i<arr3.size();i++){
maxtime=max(arr3[i],maxtime);
}
cout<<maxtime;
return 0;
}