C语言实现-18118.勇者斗恶龙

/*Description
有n个头的恶龙,你希望雇一些骑士把它杀死(即砍掉所有头)。村里有m个骑士可以雇佣,一个能力值为x的骑士可以砍掉恶龙
一个直径不超过x的头,且需要支付x个金币。如何雇佣骑士才能砍掉恶龙的所有头,且需要支付的金币最少?注意,一个骑士只
能砍一个头(且不能被雇佣两次)

输入格式
多组数据,每组数据的第一行为正整数n和m(1 <= n, m <= 200000);以下n行每行为一个整数,即恶龙每个头的直径;以下m行每行为
一个整数,即每个骑士的能力。输入结束标志n=m=0;

输出格式:每组数据,输出最少花费,无解输出"Loowater is doomed!"

输入样例
2 3
5
4
7
8
4
2 1
5
5
10
0 0
输出样例
11
Loowater is doomed!
*/

虽然C语言在电脑编译器结果正确,输入输出循环细节处也参照AC的代码修改过,但仍无法通过OJ,显示超时

可能原因: AC的代码是通过C++实现的,使用了排序工具sort()函数,工具运用了最优的排序算法,效率较高,用时较短,而C语言的冒泡排序或者选择排序时间复杂度较大,所以显示超时,无法通过OJ

    sort函数用于C++中,对给定区间所有元素进行排序,默认为升序,也可进行降序排序。
    sort函数进行排序的时间复杂度为n*log2n,比冒泡之类的排序算法效率要高,
    sort函数包含在头文件为#include<algorithm>的c++标准库中。

-----------------------C语言实现,运用选择排序,冒泡排序

# include <stdio.h>
int main()
{
	int n = 0, m = 0;
	int i = 0, j = 0, sum = 0, temp = 0, flag, k;
	int diameter[200000], ability[200000];

	while (scanf("%d%d", &n, &m) != EOF, n || m) {
		//如果恶龙的头的个数大于0并且勇者个数为0
		if (n > 0 && m == 0) {
			printf("Loowater is doomed!\n");
			return 0;
		}

		for (i = 0; i < n; i++) {
			scanf("%d", &diameter[i]);
		}
		for (i = 0; i < m; i++) {
			scanf("%d", &ability[i]);
		}
		//对恶龙头的直径进行选择升序排序
		for (i = 0; i < n - 1; i++) {
			for (j = 1; j < n; j++) {
				if (diameter[i] > diameter[j]) {
					temp = diameter[i];
					diameter[i] = diameter[j];
					diameter[j] = temp;
				}
			}
		}

		//对勇者的能力进行冒泡升序排序
		for (i = 0; i < m; i++) {
			for (j = 0; j < m-1-i; j++) {
				if (ability[j] > ability[j + 1]) {
					temp = ability[j];
					ability[j] = ability[j + 1];
					ability[j + 1] = temp;
				}
			}
		}

		/*关键代码:计算最少的金币*/
		k = 0;
		sum = 0;
		for (i = 0; i < n; i++) {
            	flag = 1;                //假设每个恶龙的头的直径都能被勇者砍掉,做个标记
			for (j = k; j < m; j++) {
                if (diameter[i] <= ability[j]){ //如果直径小于等于勇者能力值
                    sum += ability[j];  //累加金币
                    k = j +1;           //因为前面对数据进行了排序,所以此处j+1就是遍历后面的勇者的能力值,确保不重复雇佣该勇者
                    flag = 0;           //改变标记,即该头不能被砍掉
                    break;              //结束内部循环,继续外部循环判断下一个头能不能被砍掉
                }

			}
			if (flag){                  //恶龙的这一个头不能被砍掉,输出无解并结束外部循环
                printf("Loowater is doomed!\n");
                return 0;
			}
		}
		/*如果恶龙的每一个头都被砍掉,则输出总金币并继续下一组测试实例*/
		if (i == n){
           	     printf("%d\n", sum);
		}

	}
}



----------------------网上AC的代码,C++实现:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>

using namespace std;
int a[200000],b[200000];

int main()
{
    int n,m,i,j,tot;
    while(scanf("%d%d",&n,&m),n||m)
    {
        tot=0;
        if(n>0&&m==0)
        {
            printf("Loowater is doomed!\n");
            return 0;
        }
        for(i=0; i<n; ++i)
        {
            scanf("%d",&a[i]);
        }
        for(i=0; i<m; ++i)
        {
            scanf("%d",&b[i]);
        }
        sort(a,a+n);
        sort(b,b+m);
        j=0;
        for(i=0; i<n; ++i)
        {
            for(; j<m; ++j)
            {
                if(a[i]<=b[j])
                {
                    tot+=b[j];
                    j++;
                    break;
                }
            }
            if(i<n&&j>=m)
            {
                printf("Loowater is doomed!\n");
                return 0;
            }
        }
        printf("%d\n",tot);
    }

    return 0;
}

发布了9 篇原创文章 · 获赞 4 · 访问量 276

猜你喜欢

转载自blog.csdn.net/Hunter_Kevin/article/details/105152407
今日推荐