zeroleonhart(莱昂哈特) 的方法已经符合要求了,不知道楼主还有什么要求? a b c d e f g h i j 550 600 700 700 650 500 500 600 600 5001 200 9 2 100 8 3 200 5 4 100 3 5 200 6 6 200 4c d e h i b a f g j 年级 700 700 650 600 600 600 550 500 500 500 500 500 450 400 400 400 350 300 300 500 1 j c d e h i b a f g 500 500 500 450 400 400 400 350 300 300 400 400 400 350 300 300 300 250 300 300 2 j c d e h i b f g a 400 400 400 350 300 300 300 300 300 250 200 200 200 150 100 300 300 300 300 250 3 i b f g a j c d e h 300 300 300 300 250 200 200 200 150 100 200 200 200 300 250 200 200 200 150 100 4 g a i b f j c d e h 300 250 200 200 200 200 200 200 150 100 100 50 0 0 0 0 200 200 150 100 5 c d e h g + a i + b + f j 200 200 200 200 100 100 100 50 50 0 0 0 0 0 0 0 0 0 0 0 6
一年级:c,d,e,h,i,b,a,f,g每人一个,每种水果200个
二年级:c,d,j,e,h,i,b,a每人一个,每种水果100个
五年级:c,d,j,e,h,i每人一个,每种水果200个
三年级:b,f,g,a,c每人一个,每种水果200个
六年级:d200,j200,e150+a50,b100+f100,d,j每人一个,另外两种水果在e和a,b和f之间选择
四年级:g,h,i每人一个,每种水果100个,至此全部发完
a b c d e f g h i j
550 600 700 700 650 500 500 600 600 5001 200 9
2 100 8
3 200 5
4 100 3
5 200 6
6 200 4c d e h i b a f g j 年级
700 700 650 600 600 600 550 500 500 500
500 500 450 400 400 400 350 300 300 500 1
j c d e h i b a f g
500 500 500 450 400 400 400 350 300 300
400 400 400 350 300 300 300 250 300 300 2
j c d e h i b f g a
400 400 400 350 300 300 300 300 300 250
200 200 200 150 100 300 300 300 300 250 3
i b f g a j c d e h
300 300 300 300 250 200 200 200 150 100
200 200 200 300 250 200 200 200 150 100 4
g a i b f j c d e h
300 250 200 200 200 200 200 200 150 100
100 50 0 0 0 0 200 200 150 100 5
c d e h g + a i + b + f j
200 200 200 200 100 100 100 50 50 0
0 0 0 0 0 0 0 0 0 0 6
这段程序是最最最土的。但一样能得出结果
$food=array(
'a'=>550,
'b'=>600,
'c'=>700,
'd'=>700,
'e'=>650,
'f'=>500,
'g'=>500,
'h'=>600,
'i'=>600,
'j'=>500
);
$student=array();
function get_food($index)
{
global $student,$food;
//该拿几个
if($index<200) $num=9;
elseif($index<300) $num=8;
elseif($index<500) $num=5;
elseif($index<600) $num=3;
elseif($index<800) $num=6;
else $num=4;
foreach($food as $k=>$v){
if($v>0){
$food[$k]--;
$student[$index].=$k;
$num--;
if($num==0) break;
}
}
while($num>0){
for($i=0;$i<$index;$i++){
foreach($food as $k=>$v){
if($v>0 && false===strpos($student[$i],$k)){
for($j=0;$j<strlen($student[$i]);$j++){
if(false===strpos($student[$index],$student[$i][$j])){
$student[$index].=$student[$i][$j];
$student[$i]=substr($student[$i],0,$j).substr($student[$i],$j+1).$k;
$food[$k]--;
$num--;
break 3;
}
}
}
}
}
}
}for($i=0;$i<1000;$i++){
get_food($i);
}
foreach($student as $k=>$v){
echo sprintf("%04d",$k+1).":{$v}<br>";
}
exit;
导致某人拿同一水果。解决办法:相信每个小朋友都是聪明的,他们会按照以下方法去取水果。
原则一:从最多的水果开始挑选。
原则二:每人要求个数少的优先挑选。具体实现:
排列水果 从多到少: sortapple()
悠闲挑选水果顺序: 3 4 5 6 8 9
算法时间: (1000)*(200*9+100*8+200*5+100*3+200*6+200*4) = 100万次
算法优化: sortapple()函数 个人认为还有更好的办法。
poyi_820921() 是不是去笔面试 :)
原则一:优先拿剩下的水果数多的
原则二:让要求分到水果种类多的学生先拿。个人感觉算法时间不会有百万级那么大,应该是1000*(10个数排序的算法时间)
任一指定班级人数,任一指定班每人应该分得水果数,任一指定每种水果数目
欢迎各位同僚指点一二
同意你嘀观点,,但有一点跟你有点差别
解决办法:相信每个小朋友都是聪明的,他们会按照以下方法去取水果。
原则一:从最多的水果开始挑选。
原则二:个数要求多嘀年级优先挑选。具体实现:
排列水果 从多到少: sortapple()
个数要求多嘀年级挑选,挑一次sorapple()一次,保证不出现剩下嘀水果品种不能满足年级要求嘀个数
悠闲挑选水果顺序: 9,8,6,5,4,3
算法时间:约为 M(学生人数)*N(水果种类数)
#define GRADES 6void fruit_order(int);int grade_students[GRADES]={200,100,200,100,200,200};
int grade_fruits[GRADES]={9,8,5,3,6,4};char fruit_name[FRUIT_KINDS]={'a','b','c','d','e',
'f','g','h','i','j'};
int fruits[FRUIT_KINDS]={550,600,700,700,650,
500,500,600,600,500};
int main()
{ int temp;//水果的数量先排序
int k=FRUIT_KINDS-1;
for (int i=0;i<k;i++) {
for(int j=i+1;j<FRUIT_KINDS;j++) {
if (fruits[i]<fruits[j]) {
temp=fruits[i];
fruits[i]=fruits[j];
fruits[j]=temp;
temp=fruit_name[i];
fruit_name[i]=fruit_name[j];
fruit_name[j]=temp;
}
}
}
//output
for (k=0;k<FRUIT_KINDS;k++) {
cout<< fruit_name[k] <<":" << fruits[k] << ",";
}
cout << endl;
//外循环是年级,内循环是人数,里面第三层循环是每年级可拿的水果数
for(int i=0;i<GRADES;i++) {
k=grade_fruits[i]-1; for (int j=0;j<grade_students[i];j++) {
for (int x=0;x<=k;x++) {
fruits[x]--;
}
fruit_order(grade_fruits[i]);
}
//output
for (k=0;k<FRUIT_KINDS;k++) {
cout<< fruit_name[k] <<":" << fruits[k] << ",";
}
cout << endl;
}
}
void fruit_order(int bs)
{
int i,j,temp;
for (i=bs-1;(i>=0) && (fruits[i]<fruits[i+1]);i--) {
for(j=FRUIT_KINDS-1;j>=i+1;j--)
{
if (fruits[i]<fruits[j])
{
temp=fruits[i];
fruits[i]=fruits[j];
fruits[j]=temp;
temp=fruit_name[i];
fruit_name[i]=fruit_name[j];
fruit_name[j]=temp;
}
}
}
} 执行结果:
c:700,d:700,e:650,b:600,h:600,i:600,a:550,f:500,g:500,j:500, //未拿时
c:500,d:500,e:450,b:400,h:400,i:400,j:363,g:363,a:362,f:362, //一年级拿后
c:400,d:400,e:350,h:308,j:307,g:307,a:307,f:307,i:307,b:307, //二年级拿后
c:230,d:230,a:230,g:230,h:230,e:230,b:230,i:230,j:230,f:230, //三年级拿后
j:200,f:200,d:200,c:200,g:200,a:200,b:200,i:200,h:200,e:200, //四年级拿后
d:80,c:80,g:80,a:80,j:80,f:80,b:80,i:80,h:80,e:80, //五年级拿后
d:0,c:0,g:0,a:0,j:0,f:0,b:0,i:0,h:0,e:0, // 六年级都给拿光了