ACM程序设计省赛题
Description操作系统的一个重要功能是进行进程调度,其进程调度的算法有多种,其中最简单的调度算法是先进先出服务(FCFS)算法,该算法的思想是:先进入就绪队列的先...
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
Sample Output
3.5000
Source
我的解法
#include<stdio.h>
#define MAX 1000
struct In
{
float come;
float exe;
};
struct In x[MAX];
float zhou[MAX];
int main()
{
int zhouCount=0;
int count=0,i,j;
struct In temp;
float timeCount=0,result=0,T,T1;
scanf("%f",&T);
T1 = T;
while(T--)
{
scanf("%f %f",&x[count].come,&x[count].exe);
count++;
}
for (j = 0; j < T1 - 1; j++)
for (i = 0; i < T1 - 1 - j; i++)
{
if(x[i].come > x[i + 1].come)
{
temp = x[i];
x[i] = x[i + 1];
x[i + 1] = temp;
}
else if
(x[i].come ==x[i + 1].come)
{
if(x[i].exe > x[i + 1].exe)
{
temp = x[i];
x[i] = x[i + 1];
x[i + 1] = temp;
}
}
}
timeCount = x[zhouCount].come;
zhou[zhouCount] = x[zhouCount].exe;
timeCount += zhou[zhouCount++];
for(i=1;i<T1;i++)
{
if(x[i].come<=timeCount)
{
zhou[zhouCount] = x[zhouCount].exe+(timeCount-x[i].come);
timeCount += zhou[zhouCount++];
}
else
{
zhou[zhouCount] = x[zhouCount].exe;
timeCount += zhou[zhouCount++];
}
}
for(i=0;i<T1;i++)
{
result+=zhou[i];
}
result -= x[0].come;
printf("%0.4f\n",result/T1);
return 0;
}
运行结果是对的 ,但是在oj系统里面总是报错 wrong anwer ???
想不通为什么。求指导?? 展开
操作系统的一个重要功能是进行进程调度,其进程调度的算法有多种,其中最简单的调度算法是先进先出服务(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
Sample Output
3.5000
Source
我的解法
#include<stdio.h>
#define MAX 1000
struct In
{
float come;
float exe;
};
struct In x[MAX];
float zhou[MAX];
int main()
{
int zhouCount=0;
int count=0,i,j;
struct In temp;
float timeCount=0,result=0,T,T1;
scanf("%f",&T);
T1 = T;
while(T--)
{
scanf("%f %f",&x[count].come,&x[count].exe);
count++;
}
for (j = 0; j < T1 - 1; j++)
for (i = 0; i < T1 - 1 - j; i++)
{
if(x[i].come > x[i + 1].come)
{
temp = x[i];
x[i] = x[i + 1];
x[i + 1] = temp;
}
else if
(x[i].come ==x[i + 1].come)
{
if(x[i].exe > x[i + 1].exe)
{
temp = x[i];
x[i] = x[i + 1];
x[i + 1] = temp;
}
}
}
timeCount = x[zhouCount].come;
zhou[zhouCount] = x[zhouCount].exe;
timeCount += zhou[zhouCount++];
for(i=1;i<T1;i++)
{
if(x[i].come<=timeCount)
{
zhou[zhouCount] = x[zhouCount].exe+(timeCount-x[i].come);
timeCount += zhou[zhouCount++];
}
else
{
zhou[zhouCount] = x[zhouCount].exe;
timeCount += zhou[zhouCount++];
}
}
for(i=0;i<T1;i++)
{
result+=zhou[i];
}
result -= x[0].come;
printf("%0.4f\n",result/T1);
return 0;
}
运行结果是对的 ,但是在oj系统里面总是报错 wrong anwer ???
想不通为什么。求指导?? 展开
1个回答
展开全部
你自己测试不够,比如下面这组你的答案是错的:
4
1 1
4 1
8 5
9 2
正确答案应该是3.25,你的是2。
这说明你的代码逻辑有问题。另外说些其他问题:
1、ACM的题目大多都是多组数据,输入输出描述中有“每组测试数据……”之类的,这多组数据是要在一次运行下输入的,而不是运行多次。你最好先学习下关于做ACM题目的各种常见输入输出方式,这是最基本的。
2、“第一行为一个正整数N”,输入明明是一个整数,你读入却用的是float,实数都是有可能存在误差的,比如输入5,T1的值可能是5.00000001,这不是一定会出现,但是一旦出现,你的循环for (j = 0; j < T1 - 1; j++)就会比你预想的多循环一次。
4
1 1
4 1
8 5
9 2
正确答案应该是3.25,你的是2。
这说明你的代码逻辑有问题。另外说些其他问题:
1、ACM的题目大多都是多组数据,输入输出描述中有“每组测试数据……”之类的,这多组数据是要在一次运行下输入的,而不是运行多次。你最好先学习下关于做ACM题目的各种常见输入输出方式,这是最基本的。
2、“第一行为一个正整数N”,输入明明是一个整数,你读入却用的是float,实数都是有可能存在误差的,比如输入5,T1的值可能是5.00000001,这不是一定会出现,但是一旦出现,你的循环for (j = 0; j < T1 - 1; j++)就会比你预想的多循环一次。
意法半导体(中国)投资有限公司
2023-06-12 广告
2023-06-12 广告
单片机课程设计是针对《单片机原理及应用技术》课程的一项重要的动手实践活动。该课程设计的目标是让学生通过实际项目的开发,掌握单片机的开发技能,提高解决实际问题的能力,并且加深对单片机原理及应用技术的理解。课程设计的内容包括项目概述、项目要求、...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询