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;

//沒了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章