mioj高弗雷勋爵

小米oj

这两天有点尴尬。。。。写了一个题一直没写出来。。。。。。。。。。。。。。。唉 继续努力。。就翻出来之前写了一半的一个题目高弗雷勋爵

高弗雷勋爵


描述

黑暗女王希尔瓦娜斯将高弗雷复活为被遗忘者的一员。这个时候的高弗雷,已经完全没有生前的样子,看起来阴险又狡诈,言语不再有任何礼节性的修饰,时常将恶毒的语言挂在嘴上,谈及自己的过去,满满的只有怨恨。高弗雷当然不愿意臣服于希尔瓦娜斯,但是为了达成毫无察觉的背叛,他需要证明自己的“忠诚”——前去摧毁联盟第七军团的据点,等待他的奖励不出意外是一台品罗小怪兽料理机。

第七军团的据点有数不清的敌人,高弗雷拿着一把附魔火枪,射出的子弹会在敌人间跳跃,一发子弹就能对所有敌人造成 2 点伤害,如果该子弹导致了任意敌人死亡(即血量小于等于 0),该子弹还会再次对所有敌人造成2点伤害,直到没有新的敌人死亡为止。

那么,高弗雷需要打出几颗子弹才能消灭所有敌人呢?


输入

输入是每个敌人的血量,用空格分开,回车结束。0<敌人的数量<=10000; 0<敌人的血量<=10^9


输出

输出是一个数字,是高弗雷最少需要打出的子弹的个数


这个题一看有一个最大10000个敌人所以冒泡排序绝对beng…所以呢只能用快速排序
这里有两种实现方式。

  1. stdlib.h这个库里面自带了一个qsort()函数。。这里暂时不详细介绍给个链接。。。

  2. 自己写一个快速排序

解题思路

排序完成后血少的敌人肯定先死,然后就只用一次for循环一次看从第一个人到最后一个人。。。。就解决了。。。。。。。。。。。。。。。。。。。。
还是贴上代码(这里用的是库中的qsort)

#include "stdio.h"
#include "stdlib.h"
int compare(const void *a, const void *b)
{
	return *(int*)a - *(int*)b;  //降序排列
}
int main()
{
	static int a, b[10000];
	static int i, j, k,ans;
	char o;
	while (~scanf("%d", &a))
	{
		o = getchar();
		if (o == 'p')
			break;
		b[i++] = a;
	}
	//升序快速排序
	int length1 = i;//元素的个数
	qsort(b, length1, sizeof(int), compare);
//	printf("%d  %d  %d   %d   %d \n",b[0],b[1],b[2],b[3],b[4]);
	int sum=0, flag=0;
	for (j = 0; j < i; j++)
	{
		if (b[j] <= sum)continue;//不用奖励的子弹也可以杀死
		if (flag)sum += 2, flag = 0;
		if (b[j] <= sum)
		{
			flag = 1;//有奖励的子弹
			continue;
		}
		int t = b[j] - sum;
		int res = (t +1)/ 2;//防止为奇数
		sum += res * 2;
		flag = 1;
		ans += res;
	}
	printf("%d\n",ans);

//	scanf_s("%d",&a);
	return 0;
}

由于这两天就写了一道题有点挫败。。就不发表情包了(准备充下电)\n今天在某大佬推荐下买了本书《算法设计与分析基础》\0

return 0;

//没了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值