/*
* 程序的版权和版本声明部分:
* Copyright (c) 2014,郑州大学SIAS国际学院
* 作 者: 王 杰
* 完成日期:2014 年 3 月 25 日
*
* 对任务及求解方法的描述部分:
* 输入描述: 略或见注释、总结
* 问题描述: 略或见注释、总结
* 程序输出: 略或见注释、总结
* 问题分析: 略或见注释、总结
* 算法设计: 略或见注释、总结
*/
#include<stdio.h>
#include<stdlib.h>
//类比打牌的摸牌阶段,key代表待排序的数。插入排序insert sort
void insert_sort(int arr[],int length)
{
int i,j,key;
for(j=1;j<length;j++){ //每次循环代表要插入的数key,共有n-1个key需要插入(排序)
//1、这两句是每次key插入之前的准备工作
key=arr[j];
i=j-1;
//2、找出key要插入的位置,并把位置腾出来
while(i>=0 && arr[i]>key){
arr[i+1]=arr[i];
i--;
}
//3、把key插入到合适的位置上
arr[i+1]=key;
}
}
/*
//返回一个数组中的最大值,只是最大值,没有下标,也可能有多个最大值
int return_max(int arr[],int length)
{
int max,i;
max=arr[0];
for(i=1;i<length;i++){
max=max>arr[i]? max:arr[i];
}
return max;
}
*/
int main()
{
int s,w,n,i,j,count,w1;
scanf("%d",&s);
while(s--){
count=0;
scanf("%d%d",&w,&n);
int a[n];
for(i=0;i<n;i++)
scanf("%d",&a[i]);
insert_sort(a,n);
i=n-1;
w1=w;
while(w1>0 && i>=0){
if(a[i]==0)
i--;
else{
w1-=a[i];
a[i]=0;
i--;
for(j=i;j>=0;j--){
if(a[j]<=w1 && a[j]!=0){
//i--;
a[j]=0;
break;
}
}
count++;
w1=w;
}
}
printf("%d\n",count);
}
return 0;
}
运行结果:
总结:开始没有理解清题意,“一条独木舟最多只能乘坐两个人” 忽略了这个条件,导致WR
延伸:如果没有 “一条独木舟最多只能乘坐两个人” 这个条件,代码如下:
#include<stdio.h>
#include<stdlib.h>
//类比打牌的摸牌阶段,key代表待排序的数。插入排序insert sort
void insert_sort(int arr[],int length)
{
int i,j,key;
for(j=1;j<length;j++){ //每次循环代表要插入的数key,共有n-1个key需要插入(排序)
//1、这两句是每次key插入之前的准备工作
key=arr[j];
i=j-1;
//2、找出key要插入的位置,并把位置腾出来
while(i>=0 && arr[i]>key){
arr[i+1]=arr[i];
i--;
}
//3、把key插入到合适的位置上
arr[i+1]=key;
}
}
//返回一个数组中的最大值,只是最大值,没有下标,也可能有多个最大值
int return_max(int arr[],int length)
{
int max,i;
max=arr[0];
for(i=1;i<length;i++){
max=max>arr[i]? max:arr[i];
}
return max;
}
int main()
{
int s,w,n,i,count,w1;
scanf("%d",&s);
while(s--){
count=0;
scanf("%d%d",&w,&n);
int a[n];
for(i=0;i<n;i++)
scanf("%d",&a[i]);
insert_sort(a,n);
//i=n-1;
w1=w;
while(return_max(a,n)>0){
for(i=n-1;i>=0;i--){
if(w1>0 && a[i]<=w1 && a[i]!=0){
w1-=a[i];
a[i]=0;
}
//break;
}
count++;
w1=w;
}
printf("%d\n",count);
}
return 0;
}
函数模板:返回一个数组中的最大值
//返回一个数组中的最大值,只是最大值,没有下标,也可能有多个最大值
int return_max(int arr[],int length)
{
int max,i;
max=arr[0];
for(i=1;i<length;i++){
max=max>arr[i]? max:arr[i];
}
return max;
}