題目描述
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL90zdNhXUU5UMjRkTwgDbiBHaYFGbkNDTwYVbiVHNHpleO1GTulzRilWO5xkNNh0YwIFSh9Fd4VGdsATMfd3bkFGazxyaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cGcq5CM4EjMwETM3ATNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
找出數組中的愛丁頓數,愛丁頓數E滿足的要求是,在數組中有E個元素大于E。
題目分析
我們可以将i從1周遊到輸入的N,判斷其中是否有i個數大于i。找出最大的i即可。
但是這種方法時間複雜度有點高,是以我們換一種方法。
我們先給出E初始化為0,将數組從大到小排序。從第一個位置開始周遊,如果這個位置的公裡數>E+1(E+1是天數),則我們将E+1;否則,我們直接break退出,因為數組降序,後面一定不滿足要求。
因為天數和索引存在一定關系,是以我們可以在周遊的過程中進行統計天數。
代碼
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(int a, int b) {return a > b;}
int main()
{
int n, tmp, E = 0;
scanf("%d", &n);
vector<int>v(n);
for (int i = 0; i < n; i++)
{
scanf("%d", &tmp);
v.push_back(tmp);
}
sort(v.begin(), v.end(), cmp);
//可以通過周遊0-n找出一個值,指派給E
//也可以使用這種方法,先給定一個E,在周遊的過程中,E逐漸遞增,如果公裡數>E,則E繼續遞增
for (int i = 0; i < n; i++)
{
if (v[i] <= E + 1) break;
E++;
}
printf("%d", E);
return 0;
}
答題用時8min
Q60——finish√