题目本身是《操作系统》这门课的知识,先来先服务FCFS是最简单的一种CPU调度算法
然而一直WA,试了十几组样例,都没问题,心态都快炸了
看了题解才知道,原来题文中的多组测试数据 真的是有多组测试数据
但是题目的样例里只有一组,这个误导了我,其实一个~scanf就行
我来补充一下样例:
Sample Input
4
1 1
3 3
2 2
4 4
4
0 1
1 100
2 1
3 100
Sample Output
3.5000
100.0000
AC代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iomanip>
using namespace std;
//进程
class Process {
public:
//到达时间
int arrive;
//开始时间
int start;
//运行时间
int run;
//结束时间
int finish;
};
//先进入就绪队列的先执行,后进入就绪队列的后执行
//同一时刻进入就绪队列的执行时间少的先执行
bool cmp(Process a, Process b) {
if(a.arrive != b.arrive) {
return a.arrive < b.arrive;
} else {
return a.run < b.run;
}
}
int main() {
int T = 0;
//原来题目的"多组测试数据"这个意思
//题目写对了,但是题意和样例很含糊,原来是同时有多组数据,以EOF结尾
//所以用~scanf即while(scanf("%d",&n)!=EOF
while(~scanf("%d",&T)) {
Process p[T];
for(int i = 0 ; i < T ; ++i) {
cin>>p[i].arrive>>p[i].run;
}
//按照进程执行的先后排序
sort(p,p+T,cmp);
int current_time = 0;
for(int i = 0 ; i < T ; ++i) {
if(i == 0) {
//第一个进程到达即运行
p[i].start = p[i].arrive;
} else {
//到达时间小于当前时间,即需要等待
if(current_time > p[i].arrive) {
p[i].start = current_time;
}
//不需要等待
else {
p[i].start = p[i].arrive;
}
}
//结束时间 = 开始时间+运行时间
p[i].finish = p[i].start + p[i].run;
current_time = p[i].finish;
}
double sum = 0;
for(int i = 0 ; i < T ; ++i) {
//周转时间 = 结束时间 - 到达时间
sum +=p[i].finish - p[i].arrive;
}
sum/=T;
cout<<fixed<<setprecision(4)<<sum<<endl;
//打印调试信息
// for(int i = 0 ; i < T ; ++i) {
//
// cout<<i<<":"<<endl;
// cout<<"arrive = "<<p[i].arrive<<endl;
// cout<<"start = "<<p[i].start<<endl;
// cout<<"finsh = "<<p[i].finish<<endl;
// cout<<"sum = "<<p[i].finish-p[i].arrive<<endl;
//
// }
}
return 0;
}
题文:
C.进程调度
Time Limit: 1000 MS | Memory Limit: 65536 KB |
Total Submissions: 305 | Accepted: 76 |
Description
操作系统的一个重要功能是进行进程调度,其进程调度的算法有多种,其中最简单的调度算法是先来先服务(FCFS)算法。该算法的思想是:先进入就绪队列的先执行,后进入就绪队列的后执行,同一时刻进入就绪队列的执行时间少的先执行。我们认为某一进程一旦开始执行,就一直占用处理机,直到执行结束。
而一旦处理机被其它进程占用,就绪队列中的进程就必须等待。当某一进程执行结束后,队列中排在最前面的进程就会立即执行。
一个进程从进入就绪队列到执行完毕所用的时间为其周转时间,即周转时间=等待时间+执行时间。现在给你若干进程到达就绪队列的时间以及每个队列的执行时间,请编程计算这些进程的平均周转时间。
Input
多组测试数据。
每组测试数据的第一行为一个正整数N(N<=1000),表示要处理的进程数目。
接下来有N行,每行有两个正整数Ai(Ai<=1000)和Ei(Ei<=1000),分别表示一个进程到达就绪队列的时刻和执行该进程所需的时间。
Output
对于每组测试数据,输出平均周转时间,结果保留
4
位小数。
每组输出占一行。
每组输出占一行。
Sample Input
4
1 1
3 3
2 2
4 4
1 1
3 3
2 2
4 4
Sample Output
3.5000
Hint
进程1等待时间为0,执行时间为1,其周转时间为0+1=1;
进程3等待时间为0,执行时间为2,其周转时间为0+2=2;
进程2等待时间为1,执行时间为3,其周转时间为1+3=4;
进程4等待时间为3,执行时间为4,其周转时间为3+4=7;
故平均周转时间=(1+2+4+7)/4=3.5000。
Source
2013 Anhui College Student Programming Contest--ahfywff