独木舟上的旅行

14 篇文章 0 订阅
/*
* 程序的版权和版本声明部分:
* 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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值