| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4043 人关注过本帖
标题:[求助]一个关于牛奶的问题!外加BT作业!!!
只看楼主 加入收藏
zhanghuan_10
Rank: 1
等 级:新手上路
威 望:2
帖 子:751
专家分:0
注 册:2006-10-25
收藏
得分:0 

BT教师的BT课程的BT成绩算法

从前有个BT的老师,开了一门BT的课程,布置了一批BT的实验作业,举行了一次BT的期末考试,采用一种BT的成绩算法,结果培养出一群成绩BT人也BT的学生。

这个BT的算法是总成绩100分,其中实验成绩占50%,论坛成绩占5%,期末成绩占45%。

每个实验满分100。实验成绩是所有实验的平均分乘以50%。最多不会超过100个实验。

论坛上的每个帖子最高5分,所有帖子的平均分就是论坛成绩。一般来说,每个学生发帖的个数不会超过1000。

期末考试卷面100分,乘以45%后做为期末成绩。

把实验成绩、论坛成绩和期末成绩相加就得到总成绩。不过BT老师所在的BT学校的BT成绩管理系统只能输入整数,所以成绩的小数部分必须处理掉。BT老师又有了一个BT的想法,那就是既不四舍五入,也不直接取整,而是只要小数部分不为0,都直接进位。例如59.987654321和59.123456789最后都算作60,而60.0也是60。而且,这个进位不是针对总成绩,而是针对实验成绩、论坛成绩和期末成绩。它们三个进位后,再相加计算总成绩。

比如一个BT学生实验成绩得了49.1,论坛成绩得了4.5,期末成绩得了44.1,总成绩应该是49.1+4.5+44.1==97.7,但BT进位一出,变成了50+5+45==100!

此外还要知道学生成绩的等级,>=90为优秀,>=80为良好,>=70为中等,>=60为及格,其余为不及格

现在BT老师需要一个BT的程序来帮他统计所有学生的成绩。可能BT的你得到了这个BT任务。

输入说明
输入的所有数据均为整数。第一行包含两个整数,第一个是学生总数,第二个是实验总数。学生数不会超过232-1。

然后是所有学生的各种成绩。每个学生的数据都是四行。

第一行是学生的学号,是一个不超过10位的整数;
第二行是每次实验的分数。数据个数同实验总数;
第三行的第一个数字是发帖总数,后面是每个帖子的得分;
第四行是卷面分数。
输出说明
以表格的形式输出,每列12格宽,空白地方用空格填充(最后一列不需要12格,但是要求左对齐),行尾没有空格。每行是一个学生的成绩统计,包括各项成绩和等级(A、B、C、D、E,分别表示优秀、良好、中等、及格和不及格)。最后输出各项的总平均分。所有数据都左对齐输出。表头和表尾分别用65个减号与表体分开。

输入范例
3 5106032010599 100 100 100 903 3 5 595106371061599 99 90 90 905 5 5 5 5 595106371061012 34 56 78 9010 0 1 2 3 4 5 4 3 2 160

输出范例
ID LAB FORUM FINAL TOTAL GRADE-----------------------------------------------------------------1060320105 49 5 43 97 A1063710615 47 5 43 95 A1063710610 27 3 27 57 E-----------------------------------------------------------------Average: 41.00 4.33 37.67 83.00 B


--------------------------------------------------------------------------------
注1:本故事纯属虚构,如有雷同,实属巧合
注2:BT == Beyond_Triteness
注3:printf()有直接左对齐输出的方法,找找看


该学习了。。。
2006-11-14 18:50
小小贝
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2006-9-21
收藏
得分:0 
貌似要用到ceil的方法...
2006-11-14 19:51
zhanghuan_10
Rank: 1
等 级:新手上路
威 望:2
帖 子:751
专家分:0
注 册:2006-10-25
收藏
得分:0 

呵呵!ceil是什么方法啊?我正在写呢!呵呵!太长了!
#include <stdio.h>
#include <stdlib.h>
#define M "ID LAB FORUM FINAL TOTAL GRADE"
#define N 10000
#include <math.h>

int main()
{
unsigned long m, n, ID[N];
int LAB[N], FORUM[N];
int l, FINAL[N], i, j, k;
int score1[N], score2[N], score3[N];
float num1, num2, num3, num4;

scanf("%ld%ld", &m, &n);
for(i = 0;i < m;i ++)
{
int int_integer(float m);
int sum = 0;
scanf("%ld", &ID[i]);
for(j = 0;j < n;j ++)
{
scanf("%d", &LAB[j]);
sum += LAB[j];
}
score1[i] = int_integer((sum*0.50)/n);
scanf("%d", &l);
sum = 0;
for(k = 0;k < l;k ++)
{
scanf("%d", &FORUM[k]);
sum += FORUM[k];
}
score2[i] = int_integer((sum*1.0)/k);
scanf("%d", &FINAL[i]);
score3[i] = score1[i] + score2[i] + int_integer(FINAL[i]*0.45);
}
puts(M);
int zhang(char ch);
zhang('-');
int score(int a);
num1 = num2 = num3 =0;
for(i = 0;i < m;i ++)
{
printf("%ld %d %d %d %d ", ID[i], score1[i], score2[i], FINAL[i], score3[i]);
printf("%c\n", score(score3[i]));
num1 += score1[i];
num2 += score2[i];
num3 += score3[i];
num4 += FINAL[i];

}
zhang('-');
printf("Average: %.2f %.2f %.2f %.2f ", num1/m, num2/m, num4/m, num3/m);
printf("%c", score(num3/n));

return 0;
}
int zhang(char ch)
{
int i;

for(i = 0;i < 65;i ++)
printf("%c", ch);
printf("\n");

return 0;
}
int int_integer(float m)
{
if((m - (int)m) != 0)
return (int)m;
else
return (int)m + 1;

}
int score(int a)
{
a /= 10;
switch(a)
{
case 10:
case 9:
putchar('A');
break;
case 8:
putchar('B');
break;
case 7:
putchar('C');
break;
case 6:
putchar('D');
break;
default:
putchar('E');
break;
}

return 0;
}


该学习了。。。
2006-11-14 20:04
zhanghuan_10
Rank: 1
等 级:新手上路
威 望:2
帖 子:751
专家分:0
注 册:2006-10-25
收藏
得分:0 
HIT-Online Judge,process result is Okey.
result has 5 wrong answers.
还是有错误答案啊!

该学习了。。。
2006-11-14 20:09
zhanghuan_10
Rank: 1
等 级:新手上路
威 望:2
帖 子:751
专家分:0
注 册:2006-10-25
收藏
得分:0 

改了一下!不过还是 有一个错误答案!HIT-Online Judge,process result is Okey.
result has 1 wrong answers.

#include <stdio.h>
#include <stdlib.h>
#define M "ID LAB FORUM FINAL TOTAL GRADE"
#define N 1000
#include <math.h>

int main()
{
unsigned long m, n, ID[N];
int LAB[N], FORUM[N];
int l, FINAL[N], i, j, k;
int score1[N], score2[N], score3[N];
float num1, num2, num3, num4;

scanf("%ld%ld", &m, &n);
for(i = 0;i < m;i ++)
{
int int_integer(float m);
int sum = 0;
scanf("%ld", &ID[i]);
for(j = 0;j < n;j ++)
{
scanf("%d", &LAB[j]);
sum += LAB[j];
}
score1[i] = int_integer(sum*0.50/n);
scanf("%d", &l);
sum = 0;
for(k = 0;k < l;k ++)
{
scanf("%d", &FORUM[k]);
sum += FORUM[k];
}
score2[i] = int_integer(sum*1.00/k);
scanf("%d", &FINAL[i]);
score3[i] = score1[i] + score2[i] + int_integer(FINAL[i]*0.45);
}
puts(M);
int zhang(char ch);
zhang('-');
int score(int a);
num1 = num2 = num3 =0;
for(i = 0;i < m;i ++)
{
int int_integer(float m);
printf("%ld %d %d %d %d ", ID[i], score1[i], score2[i], int_integer(FINAL[i]*0.45), score3[i]);
printf("%c\n", score(score3[i]));
num1 += score1[i];
num2 += score2[i];
num3 += score3[i];
num4 += int_integer(FINAL[i]*0.45);

}
zhang('-');
printf("Average: %.2f %.2f %.2f %.2f ", num1/m, num2/m, num4/m, num3/m);
printf("%c", score(num3/n));

return 0;
}
int zhang(char ch)
{
int i;

for(i = 0;i < 65;i ++)
printf("%c", ch);
printf("\n");

return 0;
}
int int_integer(float m)
{
if(fabs(m - (int)m) < 1E-10)
return (int)m;
else
return (int)m + 1;

}
int score(int a)
{
a /= 10;
switch(a)
{
case 10:
case 9:
putchar('A');
break;
case 8:
putchar('B');
break;
case 7:
putchar('C');
break;
case 6:
putchar('D');
break;
default:
putchar('E');
break;
}

return 0;
}


该学习了。。。
2006-11-15 15:35
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
先qsort(...)然后贪心

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2006-11-15 19:47
zhanghuan_10
Rank: 1
等 级:新手上路
威 望:2
帖 子:751
专家分:0
注 册:2006-10-25
收藏
得分:0 
先qsort(...)然后贪心,不懂!呵呵,希望你讲的明白一些,qsort(...)是什么意思!虽然我做的已经通过了!但是写的代码非常的长!

该学习了。。。
2006-11-16 18:13
zhanghuan_10
Rank: 1
等 级:新手上路
威 望:2
帖 子:751
专家分:0
注 册:2006-10-25
收藏
得分:0 

有一类试题,每相邻两项数之间的变化有一定的规律性,我们可将这种规律归纳成如下简捷的递推关系式:
Fn=g(Fn-1)
这就在数的序列中,建立起后项和前项之间的关系,然后从初始条件(或最终结果)入手,一步步地按递推关系递推,直至求出最终结果(或初始值)。很多程序就是按这样的方法逐步求解的。如果对一个试题,我们要是能找到后一项与前一项的关系并清楚其起始条件(最终结果),问题就好解决,让计算机一步步算就是了,让高速的计算机做这种重复运算,可真正起到“物尽其用”的效果。
递推分倒推法和顺推法两种形式。一般分析思路:
if求解条件F1
then begin{倒推}
由题意(或递推关系)确定最终结果Fa;
求出倒推关系式Fi-1=g'(Fi);
i=n;{从最终结果Fn出发进行倒推}
while 当前结果Fi非初始值F1 do由Fi-1=g(F1)倒推前项;
输出倒推结果F1和倒推过程;
end {then}
else begin{顺推}
由题意(或顺推关系)确定初始值F1(边界条件);
求出顺推关系式F1=g(Fi-1);
i=1;{由边界条件F1出发进行顺推}
while 当前结果Fi非最终结果Fn do由Fi=g(Fi-1)顺推后项;
输出顺推结果Fn和顺推过程;
end; {else}
一、倒推法
所谓倒推法,就是在不知初始值的情况下,经某种递推关系而获知问题的解或目标,再倒推过来,推知它的初始条件。因为这类问题的运算过程是一一映射的,故可分析得其递推公式。然后再从这个解或目标出发,采用倒推手段,一步步地倒推到这个问题的初始陈述。
下面举例说明。
[例1] 贮油点
一辆重型卡车欲穿过1000公里的沙漠,卡车耗油为1升/公里,卡车总载油能力为500公升。显然卡车一次是过不了沙漠的。因此司机必须设法在沿途建立几个储油点,使卡车能顺利穿越沙漠,试问司机如何建立这些储油点?每一储油点应存多少油,才能使卡车以消耗最少油的代价通过沙漠?
算法分析:
编程计算及打印建立的贮油点序号,各贮油点距沙漠边沿出发的距离以及存油量。
No. Distance(k.m.) oil(litre)
1 X X X X
2 X X X X
3 X X X X
... ..... ......
设dis[i] 为第i个贮油点至终点(i=0)的距离;
oil[i] 为第i个贮油点的存贮油量;
我们可以用倒推法来解决这个问题。从终点向始点倒推,逐一求出每个贮油点的位置及存油量。
下图表示倒推时的返回点:


从贮油点i向贮油点i+1倒推的策略是,卡车在点i和点i+1间往返若干次。卡车每次返回i+1处时正好耗尽500公升汽油,而每次从i+1出发时又必须装足500公升汽油。两点之间的距离必须满足在耗油最少的条件下使i点贮足i*500分升汽油的要求(0<=i<=n-1)。具体地讲,第一个贮油点i=1应距终点i=0处500km且在该处贮藏500公升汽油,这样才能保证卡车能由i=1处到达终点i=0处,这就是说
dis[1]=500 oil[1]=500;
为了在i=1处贮藏500公升汽油,卡车至少从i=2处开两趟满载油的车至i=1处。所以i=2处至少贮有2*500公升汽油,即oil[2]=500*2=1000。另外,再加上从i=1返回至i=2处的一趟空载,合计往返3次。三次往返路程的耗油量按最省要求只能为500公升。即d12=500/3km
dis[2]=dis[1]+d12=dis[1]+500/3

为了在i=2处贮存1000公升汽油,卡车至少从i=3处开三趟满载油的车至i=2处。报以i=3处至少贮有3*500公升汽油,即oil[3]=500*3=1500。加上i=2至i=3处的二趟返程空车,合计5次。路途耗油量也应为500公升,即d23=500/5,
dis[3]=dis[2]+d23=dis[2]+500/5;

依此类推,为了在i=k处贮藏k*500公升汽油,卡车至少从i=k+1处开k趟满载车至i=k处,即
oil[k+1]=[k+1]*500=oil[k]+500,加上从i=k处返回i=k+1的k-1趟返程空间,合计2k-1次。这2k-1次总耗油量按最省要求为500公升,即
dk,k+1=500/(2k-1)
dis[k+1]=dis[k]+dk,k+1
=dis[k]+500/(2k-1);

最后,i=n至始点的距离为1000-dis[n],oil[n]=500*n。为了在i=n处取得n*500公升汽油,卡车至少从始点开n+1次满载车至i=n,加上从i=n返回始点的n趟返程空车,合计2n+1次,2n+1趟的总耗油量应正好为(1000-dis[n])*(2n+1),即始点藏油为oil[n]+(1000-dis[n])*(2n+1)。
下面为程序代码:
program oil_lib;
var
k:integer; {贮油点位置序号}
d, {累计终点至当前贮油点的距离}
d1:real; {i=n至始点的距离}
oil,dis:array[1..10] of real;
i:integer; {辅助变量}
begin
writeln('NO.','distance(k.m)':30,'oil(1.)':80);
k:=1;
d:=500; { 从i=1处开始向始点倒推}
dis[1]:=500;
oil[1]:=500;
repeat
k:=k+1;
d:=d+500/(2*k-1);
dis[k]:=d;
oil[k]:=oil[k-1]+500;
until d>=1000;

dis[k]:=1000; {置始点至终点的距离值}
d1:=1000-dis[k-1]; {求i=n处至始点的距离}
oil[k]:=d1*(2*k+1)+oil[k-1]; {求始点藏油量}
for i:=0 to k do {由始点开始,逐一打印始点至当前贮油点的距离和藏油量}
writeln(i,1000-dis[k-i]:30,oil[k-i]:80);
end. {main}

转换为C语言程序如下:
#include<stdio.h>
void main()
{
int k; /*贮油点位置序号*/
float d,d1; /*d:累计终点至当前贮油点的距离,d1:i=n至始点的距离*/
float oil[10],dis[10];
int i;
printf("NO. distance(k.m.)\toil(l.)\n");
k=1;
d=500; /*从i=1处开始向始点倒推*/
dis[1]=500;
oil[1]=500;
do{
k=k+1;
d=d+500/(2*k-1);
dis[k]=d;
oil[k]=oil[k-1]+500;
}while(!(d>=1000));
dis[k]=1000; /*置始点至终点的距离值*
d1=1000-dis[k-1]; /*求i=n处至始点的距离*/
oil[k]=d1*(2*k+1)+oil[k-1]; /*求始点藏油量*/
for(i=0;i<k;i++) /*由始点开始逐一打印始点至当前贮油点的距离和藏油量*/
printf("%d\t%f\t%f\t\n",i,1000-dis[k-i],oil[k-i]);
}


该学习了。。。
2006-11-16 18:30
hujian100
Rank: 1
等 级:新手上路
帖 子:69
专家分:0
注 册:2006-9-14
收藏
得分:0 
我写的程序,与大家分享一下,请给与执教,谢谢!

#include <stdio.h>
void main()
{
int i,j,temp1,temp2;
int milk[5][2]={5,20,9,40,3,10,8,80,6,30};
int amount=0, price=0;
for(i=0;i<4;i++)
{
for(j=i+1;j<5;j++)
if(milk[i][0]>milk[j][0])
{
temp1=milk[i][0];
temp2=milk[i][1];
milk[i][0]=milk[j][0];
milk[i][1]=milk[j][1];
milk[j][0]=temp1;
milk[j][1]=temp2;
}
}
i=0;
while(amount<=100&&i<=5)
{
if((100-amount)>=milk[i][1])
{
price+=milk[i][0]*milk[i][1];
amount+=milk[i][1];
}
else
{
price+=milk[i][0]*(100-amount);
amount+=(100-amount);
}
i++;
}
printf("The total price is %d.\n",price);
}

2006-11-17 18:39
weiwuchao
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2006-11-22
收藏
得分:0 

看算法


2006-11-22 20:05
快速回复:[求助]一个关于牛奶的问题!外加BT作业!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019768 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved