小米oj
这两天有点尴尬。。。。写了一个题一直没写出来。。。。。。。。。。。。。。。唉 继续努力。。就翻出来之前写了一半的一个题目高弗雷勋爵
扑克游戏
描述
黑暗女王希尔瓦娜斯将高弗雷复活为被遗忘者的一员。这个时候的高弗雷,已经完全没有生前的样子,看起来阴险又狡诈,言语不再有任何礼节性的修饰,时常将恶毒的语言挂在嘴上,谈及自己的过去,满满的只有怨恨。高弗雷当然不愿意臣服于希尔瓦娜斯,但是为了达成毫无察觉的背叛,他需要证明自己的“忠诚”——前去摧毁联盟第七军团的据点,等待他的奖励不出意外是一台品罗小怪兽料理机。
第七军团的据点有数不清的敌人,高弗雷拿着一把附魔火枪,射出的子弹会在敌人间跳跃,一发子弹就能对所有敌人造成 2 点伤害,如果该子弹导致了任意敌人死亡(即血量小于等于 0),该子弹还会再次对所有敌人造成2点伤害,直到没有新的敌人死亡为止。
那么,高弗雷需要打出几颗子弹才能消灭所有敌人呢?
输入
输入是每个敌人的血量,用空格分开,回车结束。0<敌人的数量<=10000; 0<敌人的血量<=10^9
输出
输出是一个数字,是高弗雷最少需要打出的子弹的个数
这个题一看有一个最大10000个敌人所以冒泡排序绝对beng…所以呢只能用快速排序
这里有两种实现方式。
-
stdlib.h这个库里面自带了一个qsort()函数。。这里暂时不详细介绍给个链接。。。
扫描二维码关注公众号,回复: 6427939 查看本文章 -
自己写一个快速排序
解题思路
排序完成后血少的敌人肯定先死,然后就只用一次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;
//没了