There are N bugs to be repaired and some engineers whose abilities are roughly equal.
And an engineer can repair a bug per day. Each bug has a deadline A[i].
Question: How many engineers can repair all bugs before those deadlines at least?
1<=n<= 1e6. 1<=a[i] <=1e9
Input Description
There are multiply test cases.
In each case, the first line is an integer N , indicates the number of bugs.
The next line is n integers indicates the deadlines of those bugs.
Output Description
There are one number indicates the answer to the question in a line for each case.
Input
4
1 2 3 4
Output
1
这题只要想到思路还是很简单的,假设所有工程师每天都在修复bug,说白了就是把任务量平均分配到每个人身上。然后看当前任务最小需要多少天,不过这里需要注意的是,如果deadline如果是大于1e6的话对结果是不影响的,原因自己想想很简单。。。
按说是直接排序就行,时间是不会超时的,因为复杂度顶多也就O(nlogn)<1e8啊,但是不知道为什么这道题目O(n)复杂度都需要1000+ms,所以一开始没处理大于1e6的时候是超时的。
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 1e6
int has[1000005];
int main()
{
int n,tmp;
while(~scanf("%d",&n))
{
memset(has,0,sizeof(has));
for(int i=1; i<=n; i++)
{
scanf("%d",&tmp);
if(tmp<=n)
has[tmp]++;
}
int sum=0,res=1;
for(int i=1; i<=n;i++)
{
sum+=has[i];
res=max(ans,(int)ceil(sum*1.0/i));
}
printf("%d\n",res);
}
return 0;
}
之前直接贪心模拟的,可以过,不过不能忘了处理大于1e6的,否则超时(开始用set维护,不过TL,ORZ。。。)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 5;
int a[MAXN];
int b[MAXN];
int tot;
int main()
{
int n;
int i;
int j;
int maxB;
int lMaxB;
while (~scanf("%d", &n)) {
int n2 = n;
for (i = 0; i < n; ++i) {
scanf("%d", &a[i]);
if (a[i] >= n2) {
--i;
--n;
}
}
//cout << n << endl;
sort(a, a + n);
tot = 0;
b[tot++] = 1;
for (i = 1; i < n; ++i) {
maxB = -1;
for (j = 0; j < tot; ++j) {
if (b[j] < a[i] && b[j] > maxB) {
maxB = b[j];
lMaxB = j;
break;
}
}
if (maxB == -1) {
b[tot++] = 1;
} else {
++b[lMaxB];
}
}
printf("%d\n", tot);
}
return 0;
}
TL:
#include <bits/stdc++.h>
using namespace std;
#define MAXN 1000005
struct Class
{
bool operator () (int a,int b)
{
return a>b;
}
};
int arr[MAXN];
multiset<int,Class>mySet;
multiset<int,Class>::iterator iter;
int main()
{
int T,tmp;
while(~scanf("%d",&T))
{
mySet.clear();
for(int i=0; i<T; i++)
scanf("%d",&arr[i]);
sort(arr,arr+T);
for(int i=0; i<T; i++)
{
iter = mySet.upper_bound(arr[i]);
if(iter==mySet.end())
{
mySet.insert(1);
}
else
{
tmp=(*iter)+1;
mySet.erase(iter);
mySet.insert(tmp);
}
}
printf("%d\n",mySet.size());
}
return 0;
}
浙公网安备 33010602011771号