思路
用一个堆去维护所有的衣服,每次取湿度最大的一件进行烘干,当最大的那一件也被烘干后便是答案。这个堆的作用就是保证heap[1]永远是最大的。
你也可以用sort进行排序,但是数据好大可能会超时。
上两份代码
第一份(常规写法)
/*
Author : yukki
Time : 2020.9.1
OJ : luogu
Pid : 1843
*/
#include <cstdio>
#include <algorithm>
#include <iostream>
#define F1(i,n) for(i=1;i<=n;i++)
#define F0(i,n) for(i=0;i<=n;i++)
#define _F1(i,n) for(i=n;i>=1;i--)
#define _F0(i,n) for(i=n;i>=0;i--)
using namespace std;
int n,a,b;
int t;
int heap[500050];
int len;
void up(int p)
{
int pos = p;
while(pos >> 1)
{
if(heap[pos>>1] < heap[pos])
{
int tmp;
tmp = heap[pos];
heap[pos] = heap[pos>>1];
heap[pos>>1] = tmp;
pos = pos>>1;
}
else break;
}
}
void down(int p)
{
int pos = p;
while(pos<<1 <= len)
{
int tmp = pos<<1;
if(tmp + 1 <= len && heap[tmp] < heap[tmp+1])tmp++;
if(heap[pos] < heap[tmp])
{
int temp;
temp = heap[pos];
heap[pos] = heap[tmp];
heap[tmp] = temp;
pos = tmp;
}
else break;
}
}
void push(int num)
{
heap[++len] = num;
up(len);
}
int main()
{
register int i,j;
scanf("%d",&n);
scanf("%d",&a);
scanf("%d",&b);
len = 0;
F1(i,n)
{
int tmp;
scanf("%d",&tmp);
push(tmp);
}
int times = 0;
while(heap[1] > times * a)
{
times++;
heap[1] -= b;
down(1);
}
printf("%d\n",times);
return 0;
}
第二份(类)
/*
Author : yukki
Time : 2020.9.1
OJ : luogu
Pid : 1843
*/
#include <cstdio>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int n,a,b;
class heap
{
public:
vector <int> vec;
void init()
{
vec.push_back(0);
}
void up(int pos)
{
while(pos>>1)
{
if(vec[pos] > vec[pos>>1])
{
int tmp = vec[pos];
vec[pos] = vec[pos>>1];
vec[pos>>1] = tmp;
pos = pos>>1;
}
else break;
}
}
void down(int pos)
{
while(pos<<1 <= vec.size() - 1)
{
int p = pos << 1;
if(vec[p+1] > vec[p] && p+1 <= vec.size()-1)p++;
if(vec[p] > vec[pos])
{
int tmp = vec[p];
vec[p] = vec[pos];
vec[pos] = tmp;
pos = p;
}
else break;
}
}
void push(int num)
{
vec.push_back(num);
up(vec.size()-1);
}
void print()
{
vector <int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
};
heap T;
int main()
{
register int i,j;
cin>>n>>a>>b;
int times = 0;
T.init();
for(i=1;i<=n;i++)
{
int tmp;
cin>>tmp;
T.push(tmp);
//T.print();
}
while(T.vec[1] > a*times)
{
times++;
T.vec[1] -= b;
T.down(1);
}
cout<<times<<endl;
return 0;
}
后记
我不会类,瞎**写一写,真TM好玩。
其实这题用二分也能写,不想写了。