跪求AC代码,c/c++/java都可以
- 今日头条2018校招算法方向(第一批)
编程3产品经理(PM)有很多好的idea,而这些idea需要程序员实现。现在有N个PM,在某个时间会想出一个 idea,每个 idea 有提出时间、所需时间和优先等级。对于一个PM来说,最想实现的idea首先考虑优先等级高的,相同的情况下优先所需时间最小的,还相同的情况下选择最早想出的,没有 PM 会在同一时刻提出两个 idea。
同时有M个程序员,每个程序员空闲的时候就会查看每个PM尚未执行并且最想完成的一个idea,然后从中挑选出所需时间最小的一个idea独立实现,如果所需时间相同则选择PM序号最小的。直到完成了idea才会重复上述操作。如果有多个同时处于空闲状态的程序员,那么他们会依次进行查看idea的操作。
求每个idea实现的时间。
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
struct node {
int num,time1,grade,time2; //Time1 提出时间,time2 完成时间
}a[3010],b[3010];
int sum[3010];
int c[3010];
int cmp1(const node a,const node b) { //排序
if(a.time1!=b.time1)
return a.time1<b.time1;
if(a.grade!=b.grade)
return a.grade<b.grade;
if(a.time2==b.time2)
return a.time2<b.time2;
return a.num<b.num;
}
int main() {
int N,M,P;
cin>>N>>M>>P;
int i;
for(i=1;i<=P;i++) {
cin>>a[i].num>>a[i].time1>>a[i].grade>>a[i].time2;
b[i]=a[i]; //数据的复制
}
sort(a+1,a+1+P,cmp1);
int j=1;
/*for(i=1;i<=P;i++)
cout<<a[i].num<<" "<<a[i].time1<<" "<<a[i].grade<<" "<<a[i].time2<<endl;
cout<<endl;*/
for(int i=1;i<=P;i++) {
if(j<=M) {
sum[j]=a[i].time1;
sum[j]+=a[i].time2;
}
else if(j>M) {
if(a[i].time1>sum[j-M]) {
sum[j]=a[i].time1;
}
else
sum[j]=sum[j-M]; //一个循环
sum[j]+=a[i].time2;
}
j++;
}
memset(c,0,sizeof(c));
/*for(i=1;i<=P;i++)
cout<<sum[i]<<endl;
for(i=1;i<=P;i++)
cout<<b[i].num<<" "<<b[i].time1<<" "<<b[i].grade<<" "<<b[i].time2<<endl;
cout<<endl;*/
for(i=1;i<=P;i++)
for(int j=1;j<=P;j++) {
if(a[j].num==b[i].num&&a[j].time1==b[i].time1&&a[j].grade==b[i].grade&&
a[j].time2==b[i].time2) {
c[i]=j;
//cout<<j<<endl;
break;
}
}
for(i=1;i<=P;i++)
cout<<sum[c[i]]<<endl;
return 0;
}