小米oj
這兩天有點尷尬。。。。寫了一個題一直沒寫出來。。。。。。。。。。。。。。。唉 繼續努力。。就翻出來之前寫了一半的一個題目高弗雷勳爵
高弗雷勳爵
描述
黑暗女王希爾瓦娜斯將高弗雷復活爲被遺忘者的一員。這個時候的高弗雷,已經完全沒有生前的樣子,看起來陰險又狡詐,言語不再有任何禮節性的修飾,時常將惡毒的語言掛在嘴上,談及自己的過去,滿滿的只有怨恨。高弗雷當然不願意臣服於希爾瓦娜斯,但是爲了達成毫無察覺的背叛,他需要證明自己的“忠誠”——前去摧毀聯盟第七軍團的據點,等待他的獎勵不出意外是一臺品羅小怪獸料理機。
第七軍團的據點有數不清的敵人,高弗雷拿着一把附魔火槍,射出的子彈會在敵人間跳躍,一發子彈就能對所有敵人造成 2 點傷害,如果該子彈導致了任意敵人死亡(即血量小於等於 0),該子彈還會再次對所有敵人造成2點傷害,直到沒有新的敵人死亡爲止。
那麼,高弗雷需要打出幾顆子彈才能消滅所有敵人呢?
輸入
輸入是每個敵人的血量,用空格分開,回車結束。0<敵人的數量<=10000; 0<敵人的血量<=10^9
輸出
輸出是一個數字,是高弗雷最少需要打出的子彈的個數
這個題一看有一個最大10000個敵人所以冒泡排序絕對beng…所以呢只能用快速排序
這裏有兩種實現方式。
-
stdlib.h這個庫裏面自帶了一個qsort()函數。。這裏暫時不詳細介紹給個鏈接。。。
-
自己寫一個快速排序
解題思路
排序完成後血少的敵人肯定先死,然後就只用一次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;
//沒了