一、
P为给定的二维平面整数点集。定义 P 中某点x,如果x满足 P 中任意点都不在 x 的右上方区域内(横纵坐标都大于x),则称其为“最大的”。求出所有“最大的”点的集合。(所有点的横坐标和纵坐标都不重复, 坐标轴范围在[0, 1e9) 内)
如下图:实心点为满足条件的点的集合。请实现代码找到集合 P 中的所有 ”最大“ 点的集合并输出。
本质:找边界点。
1、sort()排序
#include<iostream>
#include<algorithm> //载入库
using namespace std;
int main()
{
int a[10]={9,6,3,8,5,2,7,4,1,0};
cout<<"排序前:";
for(int i=0;i<10;i++)
cout<<a[i]<<' ';
cout<<endl;
sort(a,a+10); //调用函数
cout<<"排序后:";
for(int i=0;i<10;i++)
cout<<a[i]<<' ';
return 0;
}
这是默认的从小到大的排序规则,如果特殊的情况需要自己定义函数来定义比较规则。
2、定义比较函数
比较函数是一个自己定义的函数,返回值是bool型,它规定了什么样的关系才是“小于”。
#include<iostream>
#include<algorithm> //载入库
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int a[10]={9,6,3,8,5,2,7,4,1,0};
cout<<"排序前:";
for(int i=0;i<10;i++)
cout<<a[i]<<' ';
cout<<endl;
sort(a,a+10,cmp); //调用函数
cout<<"排序后:";
for(int i=0;i<10;i++)
cout<<a[i]<<' ';
return 0;
}
从大到小排序。
3、对于点来说的排序
#include<iostream>
#include<algorithm> //载入库
#include<vector>
using namespace std;
struct point{ //定义结构体
int x,y;
};
bool cmp(point a,point b) //排序规则
{
if(a.y<b.y) //y小的排在前面,(y从小到大)
{
return 1;
}
else
{
if(a.y==b.y){ //y相等时,
if(a.x>b.x){ //x大的排在前面,(x从大到小)
return 1;
}
}
else{
return 0;
}
}
}
int main()
{
vector<point>vec;
point p[4];
p[0].x=1,p[0].y=6;
p[1].x=5,p[1].y=3;
p[2].x=4,p[2].y=2;
p[3].x=7,p[3].y=6;
cout<<"排序前:"<<endl;
for(int i=0;i<4;i++){
cout<<p[i].x<<" "<<p[i].y<<endl;
vec.push_back(p[i]);
}
sort(vec.begin(),vec.end(),cmp); // 注意调用方式
cout<<"排序后:"<<endl;
for(int i=0;i<4;i++){
cout<<vec[i].x<<" "<<vec[i].y<<endl;
}
return 0;
} //5 1 2 5 3 4 6 7 5 9 0
先按y从小到大排序,然后y相等时,x从大到小排。
4、排序规则代码优化
#include<iostream>
#include<algorithm> //载入库
#include<vector>
using namespace std;
struct point{ //定义结构体
int x,y;
};
bool cmp(point a,point b) //排序规则
{
return a.y==b.y?a.x>b.x:a.y<b.y; //a.y等于b.y的话,取冒号前面的内容,x大的排在前面;如果a.y不等于b.y的话,取冒号后边的内容,y小的排在前面。
}
int main()
{
vector<point>vec;
point p[4];
p[0].x=1,p[0].y=6;
p[1].x=5,p[1].y=3;
p[2].x=4,p[2].y=2;
p[3].x=7,p[3].y=6;
cout<<"排序前:"<<endl;
for(int i=0;i<4;i++){
cout<<p[i].x<<" "<<p[i].y<<endl;
vec.push_back(p[i]);
}
sort(vec.begin(),vec.end(),cmp); // 注意调用方式
cout<<"排序后:"<<endl;
for(int i=0;i<4;i++){
cout<<vec[i].x<<" "<<vec[i].y<<endl;
}
return 0;
} //5 1 2 5 3 4 6 7 5 9 0
5、该题方法
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct point{ //定义结构体
int x,y;
};
bool cmp(point a,point b){ //自定义排序方法
return a.y==b.y?a.x>b.x:a.y<b.y; //y升序,x降序
}
int main(){
int count; //计数
cout<<"输入点的个数和点:" ;
cin>>count;
vector<point>p; //容器用来装 平面上的 点
for(int i=0;i<count;i++){
point temp;
cin>>temp.x>>temp.y;
p.push_back(temp); //插入容器中,点
}
vector<point>res; //定义新的容器
sort(p.begin(),p.end(),cmp); //排序;排序的意义在于减少比较时的次数
res.push_back(p[count-1]); //左上角的那个点,一定符合条件
int maxx=p[count-1].x;
for(int i=count-2;i>=0;i--){ //逆序往回排,y始终在减小,符合条件的是,x变大的那个点。
if(p[i].x>maxx){
res.push_back(p[i]);
maxx=p[i].x;
}
}
cout<<"符合条件的点:"<<endl;
for(int i=0;i<res.size();i++){
printf("%d %d\n", res[i].x, res[i].y);
}
return 0;
} // 5 1 2 5 3 4 6 7 5 9 0
解析:如下图。排序后,点按从1到5排好了序,逆向取点时,y始终在减小,只需下一个点比上一个点的x坐标大即可。这样就只需比较相邻的点即可,而不用整个范围内的比较点。
5、Python画图
import matplotlib.pyplot as plt
plt.xlim(xmax=10,xmin=-1)
plt.ylim(ymax=10,ymin=-1)
plt.plot([1,5,4,7,9],[2,3,6,5,0],'ro')
plt.show()
二、
给定一个数组序列, 需要求选出一个区间, 使得该区间是所有区间中经过如下计算的值最大的一个:
区间中的最小数 * 区间所有数的和最后程序输出经过计算后的最大值即可,不需要输出具体的区间。如给定序列 [6 2 1]则根据上述公式, 可得到所有可以选定各个区间的计算值:
[6] = 6 * 6 = 36;
[2] = 2 * 2 = 4;
[1] = 1 * 1 = 1;
[6,2] = 2 * 8 = 16;
[2,1] = 1 * 3 = 3;
[6, 2, 1] = 1 * 9 = 9;
从上述计算可见选定区间 [6] ,计算值为 36, 则程序输出为 36。
区间内的所有数字都在[0, 100]的范围内;
1、
#include <iostream>
#include<time.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int x[n];
for (int i=0; i<n; i++)
cin>>x[i]; //输入序列
int max=0;
for (int i=0; i<n; i++)
{
int j=i;
int k=i-1; //??
int sum1=0;
while(x[i]<=x[j] && j<n) //向右找比自己大的数
{
sum1+=x[j]; //求和
j++;
}
while(x[i]<=x[k] && k>=0) //向左找比自己大的数
{
sum1+=x[k]; //累计求和
k--;
}
int temp=sum1;
if (x[i]*temp>max) //存储最大值
max=x[i]*temp;
}
cout << max << endl;
}
return 0;
}
注意理解题意:不会隔数取序列的。如上面不会出现[6,1]这种情况。
先假设第i个值是最小的,然后向左向右找比它大的数,求和,找出最大值。
三、
1、java
import java.util.*;
public class Main{
private static Scanner sc = new Scanner(System.in);
static class IdeaTask {
int pmSeq;
int raiseTime;
int prio;
int timeCost;
int endTime;
public IdeaTask(int pmSeq, int raiseTime, int prio, int timeCost) {
this.pmSeq = pmSeq;
this.raiseTime = raiseTime;
this.prio = prio;
this.timeCost = timeCost;
}
}
static class PM {
PriorityQueue<IdeaTask> pq = new PriorityQueue<>(Comparator.comparingInt(x -> x.raiseTime));
//给定程序员开始工作的时间,找到这个PM最想完成的任务
IdeaTask mostDesiredTask(int startTime) {
PriorityQueue<IdeaTask> pq2 = new PriorityQueue<>((x, y) -> {
if (x.prio != y.prio) return y.prio - x.prio;
else {
if (x.timeCost != y.timeCost) return x.timeCost - y.timeCost;
else return x.raiseTime - y.raiseTime;
}
});
while (pq.peek() != null && pq.peek().raiseTime <= startTime) {
pq2.offer(pq.poll());
}
IdeaTask mostDesiredTask = (pq2.isEmpty()) ? pq.poll() : pq2.poll();
while (!pq2.isEmpty()) {
pq.offer(pq2.poll());
}
return mostDesiredTask;
}
}
static class Programmer {
int nextWorkTime;//下次可以工作的时间
public Programmer(int nextWorkTime) {
this.nextWorkTime = nextWorkTime;
}
}
//从多个PM 最想要完成的Idea中,选其中的一个PM想要完成的idea
private static IdeaTask selectTask(PM[] pms, int workTime) {
PriorityQueue<IdeaTask> pq = new PriorityQueue<>((x, y) -> {
if (x.raiseTime == y.raiseTime || (x.raiseTime <= workTime && y.raiseTime <= workTime)) {
if (x.timeCost != y.timeCost) return x.timeCost - y.timeCost;
else return x.pmSeq - y.pmSeq;
}
if (x.raiseTime > workTime && y.raiseTime > workTime) return x.raiseTime - y.raiseTime;
if (x.raiseTime > workTime) return 1;
if (y.raiseTime > workTime) return -1;
return 0;
});
for (int i = 1; i < pms.length; i++) {
PM pm = pms[i];
IdeaTask desiredTask = pm.mostDesiredTask(workTime);
if (desiredTask != null)
pq.offer(desiredTask);
}
IdeaTask task = pq.poll();
while (!pq.isEmpty()) {
IdeaTask tmp = pq.poll();
pms[tmp.pmSeq].pq.offer(tmp);
}
return task;
}
private static List<IdeaTask> getTasks(int taskNum) {
List<IdeaTask> tasks = new LinkedList<>();
while (taskNum-- > 0) {
tasks.add(new IdeaTask(sc.nextInt(), sc.nextInt(), sc.nextInt(), sc.nextInt()));
}
return tasks;
}
private static PM[] initPM(int n, List<IdeaTask> tasks) {
PM[] pms = new PM[n + 1];
for (int i = 1; i <= n; i++) pms[i] = new PM();
for (IdeaTask task : tasks) {
pms[task.pmSeq].pq.offer(task);
}
return pms;
}
public static void main(String[] args) {
int n = sc.nextInt(), m = sc.nextInt(), p = sc.nextInt();
List<IdeaTask> tasks = getTasks(p);
PM[] pms = initPM(n, tasks);
PriorityQueue<Programmer> losersPq = new PriorityQueue<>(Comparator.comparingInt(x -> x.nextWorkTime));
for (int i = 0; i < m; i++) losersPq.offer(new Programmer(0));
while (true) {
Programmer loser = losersPq.poll();
IdeaTask task = selectTask(pms, loser.nextWorkTime);
if (task == null) break;
task.endTime = Integer.max(task.raiseTime, loser.nextWorkTime) + task.timeCost;
loser.nextWorkTime = task.endTime;
losersPq.offer(loser);
}
for (IdeaTask task : tasks) {
System.out.println(task.endTime);
}
}
}
2、C++
#include<bits/stdc++.h>
using namespace std;
struct Task //任务
{
int id;
int pm;
int time;
int pri;
int dur;
};
vector< vector<Task> > pmtasks; //任务装进容器
map<int, int> result; //?? 非重复?
int proid = 1;
struct Programer
{
Programer()
{
t = 0;
this->id = proid++;
}
int t;//当前的时间
int id;
int doTask()
{
vector<Task>::iterator findT;
int index = -1;
for (size_t i = 0; i < pmtasks.size(); i++)
{
auto& tasks = pmtasks.at(i);
if (tasks.size() == 0) continue;
auto it = tasks.begin();
while (it!= tasks.end() && it->time > t)
it++;
if (it == tasks.end()) continue;
if (index == -1)
{
findT = it;
index = i;
}
else
{
if (it->dur < findT->dur)
{
findT = it;
index = i;
}
}
}
if (index != -1)
{
t += findT->dur;
result[findT->id] = t;
pmtasks.at(index).erase(findT);
return 1;
}
else
t++;
return 0;
}
};
int main()
{
int n, m, p;
cin >> n >> m >> p;
pmtasks.resize(n);
for (size_t i = 0; i < p; i++)
{
Task task;
cin >> task.pm >> task.time >> task.pri >> task.dur;
task.id = i;
pmtasks.at(task.pm - 1).push_back(task);
}
for (size_t i = 0; i < pmtasks.size(); i++)
{
auto& tasks = pmtasks.at(i);
if (tasks.size() == 0) continue;
sort(tasks.begin(), tasks.end(), [](Task & t1, Task & t2)
{
if (t1.pri == t2.pri)
{
if (t1.dur == t2.dur)
{
return t1.time < t2.time;
}
else return t1.dur < t2.dur;
}
else return t1.pri > t2.pri;
});
}
vector<Programer> pros(m);
while (p > 0)
{
sort(pros.begin(), pros.end(), [&](Programer & t1, Programer & t2)
{
return t1.t < t2.t;
});
p -= pros.begin()->doTask();
}
for (auto &it : result)
cout << it.second << endl;
return 0;
}
//2 2 5 1 1 1 2 1 2 1 1 1 3 2 2 2 1 1 2 2 3 5 5
3、at
粗略理解at 和[ ] 等价
// vector::at
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector (10); // 10 zero-initialized ints
// assign some values:
for (unsigned i=0; i<myvector.size(); i++)
myvector.at(i)=i;
std::cout << "myvector contains:";
for (unsigned i=0; i<myvector.size(); i++)
std::cout << ' ' << myvector.at(i);
std::cout << '\n';
return 0;
}
4、resize()
重新给空间的函数,多的话就补。少的话就删。
// resizing vector
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector;
// set some initial content:
for (int i=1;i<10;i++)
myvector.push_back(i);
for (int i=0;i<myvector.size();i++)
std::cout << ' ' << myvector[i];
std::cout << '\n';
myvector.resize(5);
for (int i=0;i<myvector.size();i++)
std::cout << ' ' << myvector[i];
std::cout << '\n';
myvector.resize(8,100);
for (int i=0;i<myvector.size();i++)
std::cout << ' ' << myvector[i];
std::cout << '\n';
myvector.resize(12);
for (int i=0;i<myvector.size();i++)
std::cout << ' ' << myvector[i];
std::cout << '\n';
return 0;
}
5、-> 理解为指向
->是指针的指向运算符,通常与结构体一起使用。
5.1
下标法
#include<iostream>
using namespace std;
struct book {
char name[30];
char author[20];
}a[2] = { {"Nature","Lina" },{ "Animals","Nick" } };
int main() {
int i;
for (i = 0; i < 2; i++) {
printf("book name: %s author: %s\n", a[i].name, a[i].author);
};
return 0;
}
5.2
数组指针的移动
#include<iostream>
using namespace std;
struct book {
char name[30];
char author[20];
}a[2] = { {"Nature","Lina" },{ "Animals","Nick" } };
int main() {
struct book *p;
for (p = a; p < a+2; p++) {
printf("book name: %s author: %s\n", p->name, p->author);
};
return 0;
}
数组指针的使用。
5.3
数组名和指针名两个都要有。
#include<iostream>
using namespace std;
struct book {
char name[30];
char author[20];
};
int main() {
struct book*p;
struct book a[2] = { { "Nature","Lina" },{ "Animals","Nick" } };
p = &a[0];
printf("book name: %s author: %s\n", p->name, p->author);
p++;
printf("book name: %s author: %s\n", p->name, p->author);
return 0;
}
6、
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Idea{
public:
Idea(int PM, int start, int pri, int cost)
: mPm(PM-1), mStart(start), mPriority(pri), mCost(cost), mAchieve(0){};
//true 优先级高
bool operator< (const Idea &idea)
{
// 比较优先级
if (mPriority > idea.mPriority)
return true;
else if (mPriority < idea.mPriority)
return false;
if (mCost < idea.mCost)
return true;
else if (mCost > idea.mCost)
return false;
if (mStart < idea.mStart)
return true;
else if (mStart > idea.mStart)
return false;
if (mPm < idea.mPm)
return true;
else
return false;
};
public:
int mPm;
int mStart;
int mPriority;
int mCost;
int mAchieve;
};
bool sortPIdea(Idea* a, Idea* b){
if (*a < *b)
return true;
else
return false;
}
void printTime(vector<Idea> &vec){
for (int i = 0; i < vec.size(); i++){
cout << vec[i].mAchieve << endl;
}
}
int main()
{
int nums_PM, nums_programmer, nums_idea;
cin >> nums_PM >> nums_programmer >> nums_idea;
vector<Idea> vec_idea;
vector<vector<Idea*> > pm_idea;
vector<int> pro_state;
pm_idea.resize(nums_PM);
pro_state.assign(nums_programmer, 0);
for (int i = 0; i < nums_idea; i++){
int pm, start, pri, cost;
cin >> pm >> start >> pri >> cost;
vec_idea.push_back(Idea(pm, start, pri, cost));
}
for (int i = 0; i < nums_idea; i++){
pm_idea[vec_idea[i].mPm].push_back(&vec_idea[i]);
}
int time = 0;
int sum_idea = nums_idea;
while (1){
time++;
//更新程序员状态
for (int i = 0; i < pro_state.size(); i++){
if (pro_state[i] != 0)
pro_state[i]--;
}
//PM任务排序,[0]是PM最想实现的
for (int i = 0; i < pm_idea.size(); i++){
int j = 0;
for (j = 0; j < pm_idea[i].size(); j++){
if (pm_idea[i][j]->mStart > time){
break;
}
}
std::sort(pm_idea[i].begin(), pm_idea[i].begin() + j, sortPIdea);
}
//程序源接idea
for (int i = 0; i < pro_state.size(); i++){
if (sum_idea == 0)
{
printTime(vec_idea);
return 0 ;
}
if (pro_state[i] == 0){
Idea* p = NULL;
int index = 0;
for (int j = 0; j < pm_idea.size(); j++){
if (pm_idea[j].size() > 0 && pm_idea[j][0]->mStart <= time){
if (p == NULL){
p = pm_idea[j][0];
index = j;
}
else{
if (pm_idea[j][0]->mCost < p->mCost){
p = pm_idea[j][0];
index = j;
}
}
}
}
//暂时没有idea
if (p == NULL){
continue;
}
//接idea
sum_idea--;
pro_state[i] = p->mCost;
p->mAchieve = time + p->mCost;
pm_idea[index].erase(pm_idea[index].begin());
}
}
}
return 0;
}
7、
A是类的名字,类似于int、string等。类型A下叫aa的名字,期中a是公开的,所以aa.a可以访问,而b是不公开的,所以aa.b不可以访问。
#include<iostream>
using namespace std;
class A
{
public:
int a;
private:
int b;
};
int main()
{
A aa;
aa.a=1;
aa.b=2; //会出错,说无法访问私有成员
}
#include<bits/stdc++.h>
using namespace std;
struct Task //任务
{
int id; //编号
int pm; // pm
int time; //任务提出时间
int pri; //优先级
int dur; //完成花费时间
};
vector< vector<Task> > pmtasks; //任务装进容器
map<int, int> result; //存放结果,任务对应的结束时间
int proid = 1;
struct Programer
{
Programer()
{
t = 0;
this->id = proid++;
}
int t;//当前的时间
int id;
int doTask()
{
vector<Task>::iterator findT;
int index = -1;
for (size_t i = 0; i < pmtasks.size(); i++)
{
auto& tasks = pmtasks.at(i);
if (tasks.size() == 0) continue;
auto it = tasks.begin();
while (it!= tasks.end() && it->time > t)
it++;
if (it == tasks.end()) continue;
if (index == -1)
{
findT = it;
index = i;
}
else
{
if (it->dur < findT->dur)
{
findT = it;
index = i;
}
}
}
if (index != -1)
{
t += findT->dur;
result[findT->id] = t;
pmtasks.at(index).erase(findT);
return 1;
}
else
t++;
return 0;
}
};
int main()
{
int n, m, p;
cin >> n >> m >> p; //pm人数,coder人数,任务数
pmtasks.resize(n); //预留空间
for (int i = 0; i < p; i++)
{
Task task;
cin >> task.pm >> task.time >> task.pri >> task.dur; //输入
task.id = i;
pmtasks[task.pm - 1].push_back(task); //分 pm 插入数值
}
for (int i = 0; i < pmtasks.size(); i++) //pmtasks.size() 是pm的个数,
{
auto tasks = pmtasks[i]; //自动判断类型,包含多个任务
if (tasks.size() == 0)
continue;
sort(tasks.begin(), tasks.end(), [](Task & t1, Task & t2) //排序
{
if (t1.pri == t2.pri)
{
if (t1.dur == t2.dur)
{
return t1.time < t2.time;
}
else return t1.dur < t2.dur;
}
else return t1.pri > t2.pri;
});
}
vector<Programer> pros(m);
while (p > 0)
{
sort(pros.begin(), pros.end(), [&](Programer & t1, Programer & t2)
{
return t1.t < t2.t;
});
p -= pros.begin()->doTask();
}
for (auto &it : result)
cout << it.second << endl;
return 0;
}
//2 2 5 1 1 1 2 1 2 1 1 1 3 2 2 2 1 1 2 2 3 5 5
8、 sort()
8.1
#include<bits/stdc++.h>
using namespace std;
struct Task //任务
{
int id; //编号
int pm; // pm
int time; //任务提出时间
int pri; //优先级
int dur; //完成花费时间
};
vector< vector<Task> > pmtasks; //任务装进容器
map<int, int> result; //存放结果,任务对应的结束时间
int proid = 1;
int main()
{
int n, m, p;
cin >> n >> m >> p; //pm人数,coder人数,任务数
pmtasks.resize(n); //预留空间
for (int i = 0; i < p; i++)
{
Task task;
cin >> task.pm >> task.time >> task.pri >> task.dur; //输入
task.id = i;
pmtasks[task.pm - 1].push_back(task); //分 pm 插入数值
}
for(int i=0;i<pmtasks.size();i++)
{
cout<<"第"<<i+1<<"个产品经理的所有任务"<<endl;
for(int j=0;j<pmtasks[i].size();j++)
cout<<pmtasks[i][j].id<<" "<<pmtasks[i][j].pm<<" "<<pmtasks[i][j].time<<" "<<pmtasks[i][j].pri<<" "<<pmtasks[i][j].dur<<endl; //任务输出
}
for (int i = 0; i < pmtasks.size(); i++) //pmtasks.size() 是pm的个数,
{
auto tasks = pmtasks[i]; //自动判断类型,包含多个任务
if (tasks.size() == 0)
continue;
sort(tasks.begin(), tasks.end(), [](Task t1, Task t2) //排序
{
if (t1.pri == t2.pri) //优先级相等时
{
if (t1.dur == t2.dur) //花费时间相等
{
return t1.time < t2.time; //提出时间早的在前
}
else return t1.dur < t2.dur; //花费时间短的在前
}
else return t1.pri > t2.pri; //优先级不相等时,优先级高的在前
});
cout<<"第"<<i+1<<"个产品经理所有任务按优先级排序后的情况"<<endl;
for(int j=0;j<tasks.size();j++)
{
cout<<tasks[j].id<<" "<<tasks[j].pm<<" "<<tasks[j].time<<" "<<tasks[j].pri<<" "<<tasks[j].dur<<endl;
}
}
return 0;
}
//2 2 5 1 1 1 2 1 2 1 1 1 3 2 2 2 1 1 2 2 3 5 5
以上排序,没有将排序逻辑单独列成函数,还可以将上述程序改为如下形式。
8.2
#include<bits/stdc++.h>
using namespace std;
struct Task //任务
{
int id; //编号
int pm; // pm
int time; //任务提出时间
int pri; //优先级
int dur; //完成花费时间
};
vector< vector<Task> > pmtasks; //任务装进容器
map<int, int> result; //存放结果,任务对应的结束时间
int proid = 1;
bool myfunction (Task t1, Task t2) //排序逻辑函数
{
if (t1.pri == t2.pri) //优先级相等时
{
if (t1.dur == t2.dur) //花费时间相等
{
return t1.time < t2.time; //提出时间早的在前
}
else return t1.dur < t2.dur; //花费时间短的在前
}
else return t1.pri > t2.pri; //优先级不相等时,优先级高的在前
}
int main()
{
int n, m, p;
cin >> n >> m >> p; //pm人数,coder人数,任务数
pmtasks.resize(n); //预留空间
for (int i = 0; i < p; i++)
{
Task task;
cin >> task.pm >> task.time >> task.pri >> task.dur; //输入
task.id = i;
pmtasks[task.pm - 1].push_back(task); //分 pm 插入数值
}
for(int i=0;i<pmtasks.size();i++)
{
cout<<"第"<<i+1<<"个产品经理的所有任务"<<endl;
for(int j=0;j<pmtasks[i].size();j++)
cout<<pmtasks[i][j].id<<" "<<pmtasks[i][j].pm<<" "<<pmtasks[i][j].time<<" "<<pmtasks[i][j].pri<<" "<<pmtasks[i][j].dur<<endl; //任务输出
}
for (int i = 0; i < pmtasks.size(); i++) //pmtasks.size() 是pm的个数,
{
auto tasks = pmtasks[i]; //自动判断类型,包含多个任务
if (tasks.size() == 0)
continue;
sort(tasks.begin(), tasks.end(), myfunction); //排序
cout<<"第"<<i+1<<"个产品经理所有任务按优先级排序后的情况"<<endl;
for(int j=0;j<tasks.size();j++)
{
cout<<tasks[j].id<<" "<<tasks[j].pm<<" "<<tasks[j].time<<" "<<tasks[j].pri<<" "<<tasks[j].dur<<endl;
}
}
return 0;
}
//2 2 5 1 1 1 2 1 2 1 1 1 3 2 2 2 1 1 2 2 3 5 5
8.3
#include<bits/stdc++.h>
using namespace std;
struct Task //任务
{
int id; //编号
int pm; // pm
int time; //任务提出时间
int pri; //优先级
int dur; //完成花费时间
};
vector< vector<Task> > pmtasks; //任务装进容器
map<int, int> result; //存放结果,任务对应的结束时间
int proid = 1;
bool myfunction (Task t1, Task t2) //排序逻辑函数
{
if (t1.pri == t2.pri) //优先级相等时
{
if (t1.dur == t2.dur) //花费时间相等
{
return t1.time < t2.time; //提出时间早的在前
}
else return t1.dur < t2.dur; //花费时间短的在前
}
else return t1.pri > t2.pri; //优先级不相等时,优先级高的在前
}
int main()
{
int n, m, p;
cin >> n >> m >> p; //pm人数,coder人数,任务数
pmtasks.resize(n); //预留空间
for (int i = 0; i < p; i++)
{
Task task;
cin >> task.pm >> task.time >> task.pri >> task.dur; //输入
task.id = i;
pmtasks[task.pm - 1].push_back(task); //分 pm 插入数值
}
for(int i=0;i<pmtasks.size();i++)
{
cout<<"第"<<i+1<<"个产品经理的所有任务"<<endl;
for(int j=0;j<pmtasks[i].size();j++)
cout<<pmtasks[i][j].id<<" "<<pmtasks[i][j].pm<<" "<<pmtasks[i][j].time<<" "<<pmtasks[i][j].pri<<" "<<pmtasks[i][j].dur<<endl; //任务输出
}
for (int i = 0; i < pmtasks.size(); i++) //pmtasks.size() 是pm的个数,
{
auto& tasks = pmtasks[i]; //自动判断类型,包含多个任务
if (tasks.size() == 0)
continue;
sort(tasks.begin(), tasks.end(), myfunction); //排序
/*for(int j=0;j<tasks.size();j++)
{
cout<<tasks[j].id<<" "<<tasks[j].pm<<" "<<tasks[j].time<<" "<<tasks[j].pri<<" "<<tasks[j].dur<<endl;
}*/
}
for(int i=0;i<pmtasks.size();i++)
{
cout<<"第"<<i+1<<"个产品经理所有任务按优先级排序后的情况"<<endl;
for(int j=0;j<pmtasks[i].size();j++)
cout<<pmtasks[i][j].id<<" "<<pmtasks[i][j].pm<<" "<<pmtasks[i][j].time<<" "<<pmtasks[i][j].pri<<" "<<pmtasks[i][j].dur<<endl; //任务输出
}
return 0;
}
//2 2 5 1 1 1 2 1 2 1 1 1 3 2 2 2 1 1 2 2 3 5 5
auto & 的意思是引用,旨在对pmtasks内部按照一定逻辑排序。
#include<bits/stdc++.h>
using namespace std;
struct Task //任务
{
int id; //编号
int pm; // pm
int time; //任务提出时间
int pri; //优先级
int dur; //完成花费时间
};
vector< vector<Task> > pmtasks; //任务装进容器
map<int, int> result; //存放结果,任务对应的结束时间
int proid = 1;
bool myfunction (Task t1, Task t2) //排序逻辑函数
{
if (t1.pri == t2.pri) //优先级相等时
{
if (t1.dur == t2.dur) //花费时间相等
{
return t1.time < t2.time; //提出时间早的在前
}
else return t1.dur < t2.dur; //花费时间短的在前
}
else return t1.pri > t2.pri; //优先级不相等时,优先级高的在前
}
int main()
{
int n, m, p;
cin >> n >> m >> p; //pm人数,coder人数,任务数
pmtasks.resize(n); //预留空间
for (int i = 0; i < p; i++)
{
Task task;
cin >> task.pm >> task.time >> task.pri >> task.dur; //输入
task.id = i;
pmtasks[task.pm - 1].push_back(task); //分 pm 插入数值
}
for(int i=0;i<pmtasks.size();i++)
{
cout<<"第"<<i+1<<"个产品经理的所有任务"<<endl;
for(int j=0;j<pmtasks[i].size();j++)
cout<<pmtasks[i][j].id<<" "<<pmtasks[i][j].pm<<" "<<pmtasks[i][j].time<<" "<<pmtasks[i][j].pri<<" "<<pmtasks[i][j].dur<<endl; //任务输出
}
for (int i = 0; i < pmtasks.size(); i++) //pmtasks.size() 是pm的个数,
{
auto tasks = pmtasks[i]; //自动判断类型,包含多个任务
if (tasks.size() == 0)
continue;
sort(tasks.begin(), tasks.end(), myfunction); //排序
}
for(int i=0;i<pmtasks.size();i++)
{
cout<<"第"<<i+1<<"个产品经理所有任务按优先级排序后的情况"<<endl;
for(int j=0;j<pmtasks[i].size();j++)
cout<<pmtasks[i][j].id<<" "<<pmtasks[i][j].pm<<" "<<pmtasks[i][j].time<<" "<<pmtasks[i][j].pri<<" "<<pmtasks[i][j].dur<<endl; //任务输出
}
return 0;
}
//2 2 5 1 1 1 2 1 2 1 1 1 3 2 2 2 1 1 2 2 3 5 5
去掉引用后,如下
pmtasks内部值的顺序是不变的。
8.4
可以不用中间变量 tasks,直接在pmtasks上进行修改
#include<bits/stdc++.h>
using namespace std;
struct Task //任务
{
int id; //编号
int pm; // pm
int time; //任务提出时间
int pri; //优先级
int dur; //完成花费时间
};
vector< vector<Task> > pmtasks; //任务装进容器
map<int, int> result; //存放结果,任务对应的结束时间
int proid = 1;
bool myfunction (Task t1, Task t2) //排序逻辑函数
{
if (t1.pri == t2.pri) //优先级相等时
{
if (t1.dur == t2.dur) //花费时间相等
{
return t1.time < t2.time; //提出时间早的在前
}
else return t1.dur < t2.dur; //花费时间短的在前
}
else return t1.pri > t2.pri; //优先级不相等时,优先级高的在前
}
int main()
{
int n, m, p;
cin >> n >> m >> p; //pm人数,coder人数,任务数
pmtasks.resize(n); //预留空间
for (int i = 0; i < p; i++)
{
Task task;
cin >> task.pm >> task.time >> task.pri >> task.dur; //输入
task.id = i;
pmtasks[task.pm - 1].push_back(task); //分 pm 插入数值
}
for(int i=0;i<pmtasks.size();i++)
{
cout<<"第"<<i+1<<"个产品经理的所有任务"<<endl;
for(int j=0;j<pmtasks[i].size();j++)
cout<<pmtasks[i][j].id<<" "<<pmtasks[i][j].pm<<" "<<pmtasks[i][j].time<<" "<<pmtasks[i][j].pri<<" "<<pmtasks[i][j].dur<<endl; //任务输出
}
for (int i = 0; i < pmtasks.size(); i++) //pmtasks.size() 是pm的个数,
{
if (pmtasks[i].size() == 0)
continue;
sort(pmtasks[i].begin(), pmtasks[i].end(), myfunction); //排序
}
for(int i=0;i<pmtasks.size();i++)
{
cout<<"第"<<i+1<<"个产品经理所有任务按优先级排序后的情况"<<endl;
for(int j=0;j<pmtasks[i].size();j++)
cout<<pmtasks[i][j].id<<" "<<pmtasks[i][j].pm<<" "<<pmtasks[i][j].time<<" "<<pmtasks[i][j].pri<<" "<<pmtasks[i][j].dur<<endl; //任务输出
}
return 0;
}
//2 2 5 1 1 1 2 1 2 1 1 1 3 2 2 2 1 1 2 2 3 5 5
9.map()
#include<bits/stdc++.h>
using namespace std;
int main()
{
map<int,string> A;
A[3]="c";
A[1]="a";
A[4]="d";
A[2]="b";
for(int i=0;i<A.size();i++)
{
cout<<A[i]<<" "; // 注意这里的i是键,而非下标
}
for(map<int,string>::iterator it=A.begin();it!=A.end();it++) //利用迭代器往外输出
{
cout<<it->first<<" "<<it->second<<endl;
}
}
注意map键和下标的区分,所以最好利用迭代器输出。
再有,map 会自动去重,排序。
10、
#include<bits/stdc++.h>
using namespace std;
struct Task //任务
{
int id; //编号
int pm; // pm
int time; //任务提出时间
int pri; //优先级
int dur; //完成花费时间
};
vector< vector<Task> > pmtasks; //任务装进容器
map<int, int> result; //存放结果,任务对应的结束时间
int proid = 1;
struct Programer
{
Programer() //函数重载,给程序员赋初始值
{
t = 0;
this->id = proid++; //程序员id
}
int t;//当前的时间
int id; //程序员id
int doTask() //程序员具体操作
{
vector<Task>::iterator findT;
int index = -1;
for (size_t i = 0; i < pmtasks.size(); i++) //i是产品经理人数,
{
auto& tasks = pmtasks.at(i);
if (tasks.size() == 0)
continue;
auto it = tasks.begin();
while (it!= tasks.end() && it->time > t) //循环查找问题提出时间小于等于 当前程序员时间的任务
it++;
if (it == tasks.end())
continue;
if (index == -1)
{
findT = it; //找到任务的位置
index = i; //找到要做那个 产品经理的任务
}
else
{
if (it->dur < findT->dur) //比较两个产品经理任务耗时,选择小的那个耗时来做
{
findT = it;
index = i;
}
}
}
if (index != -1)
{
t += findT->dur;
result[findT->id] = t; //每个任务完成时间
pmtasks.at(index).erase(findT); //将index产品经理的任务删除
for(int k=0;k<pmtasks.size();k++)
{
cout<<"第"<<k+1<<"个产品经理所有任务按优先级排序后的情况"<<endl;
for(int j=0;j<pmtasks[k].size();j++)
cout<<pmtasks[k][j].id<<" "<<pmtasks[k][j].pm<<" "<<pmtasks[k][j].time<<" "<<pmtasks[k][j].pri<<" "<<pmtasks[k][j].dur<<endl; //任务输出
}
return 1; //任务数减1
}
else
t++; //说明该时间没有任务可做,让其自由流逝
return 0; //任务数不变
}
};
int main()
{
int n, m, p;
cin >> n >> m >> p; //pm人数,coder人数,任务数
pmtasks.resize(n); //预留空间
for (int i = 0; i < p; i++)
{
Task task;
cin >> task.pm >> task.time >> task.pri >> task.dur; //输入
task.id = i;
pmtasks[task.pm - 1].push_back(task); //分 pm 插入数值
}
for (int i = 0; i < pmtasks.size(); i++) //pmtasks.size() 是pm的个数,
{
auto &tasks = pmtasks[i]; //自动判断类型,包含多个任务
if (tasks.size() == 0)
continue;
sort(tasks.begin(), tasks.end(), [](Task t1, Task t2) //排序
{
if (t1.pri == t2.pri) //优先级高的在前
{
if (t1.dur == t2.dur) //花费时间短的在前
{
return t1.time < t2.time; //提出时间早的在前
}
else return t1.dur < t2.dur;
}
else return t1.pri > t2.pri;
});
}
for(int i=0;i<pmtasks.size();i++)
{
cout<<"第"<<i+1<<"个产品经理所有任务按优先级排序后的情况"<<endl;
for(int j=0;j<pmtasks[i].size();j++)
cout<<pmtasks[i][j].id<<" "<<pmtasks[i][j].pm<<" "<<pmtasks[i][j].time<<" "<<pmtasks[i][j].pri<<" "<<pmtasks[i][j].dur<<endl; //任务输出
}
vector<Programer> pros(m); //调用程序员函数 ,m为程序员人数,默认为初始值为0。
cout<<"初始程序员列表:"<<endl;
for(int i=0;i<pros.size();i++)
{
cout<<pros[i].t<<" "<<pros[i].id<<endl;
}
while (p > 0)
{
sort(pros.begin(), pros.end(), [](Programer t1, Programer t2) //排序当前时间早的在前 ,完成任务时间早的在前
{
return t1.t < t2.t;
});
cout<<"第"<<5-p<<"个任务程序员列表:"<<endl;
for(int i=0;i<pros.size();i++)
{
cout<<pros[i].t<<" "<<pros[i].id<<endl;
}
p -= pros.begin()->doTask(); // 排在最前的程序员开始做任务
}
for (auto &it : result) //输出结果
cout << it.second << endl;
return 0;
}
//2 2 5 1 1 1 2 1 2 1 1 1 3 2 2 2 1 1 2 2 3 5 5
展示了每个程序员的完成情况 和 产品经理的任务剩余情况。