贪心总结
之前的总结
#10005. 「一本通 1.1 练习 1」数列极差
小的先处理,最后肯定最大
大的先处理,最后肯定最小
两个优先队列维护即可
#include<cstdio>
#include<queue>
#include<functional>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std;
int main()
{
int n;
while(scanf("%d", &n) && n)
{
priority_queue<int, vector<int>, greater<int> > qmax; //小的先处理
priority_queue<int> qmin; //大的先处理
REP(i, 0, n)
{
int x; scanf("%d", &x);
qmax.push(x); qmin.push(x);
}
REP(i, 1, n)
{
int a = qmax.top(); qmax.pop();
int b = qmax.top(); qmax.pop();
qmax.push(a * b + 1);
}
REP(i, 1, n)
{
int a = qmin.top(); qmin.pop();
int b = qmin.top(); qmin.pop();
qmin.push(a * b + 1);
}
printf("%d\n", qmax.top() - qmin.top());
}
return 0;
}
#10006. 「一本通 1.1 练习 2」数列分段
每一段尽量大就好了,不想敲了。
#10007. 「一本通 1.1 练习 3」线段
按照右端点排序,尽量放。
#include<cstdio>
#include<queue>
#include<algorithm>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std;
const int MAXN = 1e6 + 10;
struct node
{
int l, r;
void read() { scanf("%d%d", &l, &r); }
bool operator < (const node& rhs) const
{
return r < rhs.r;
}
}a[MAXN];
int main()
{
int n; scanf("%d", &n);
REP(i, 0, n) a[i].read();
sort(a, a + n);
int ans = 1, k = a[0].r;
REP(i, 1, n)
if(a[i].l >= k)
{
ans++;
k = a[i].r;
}
printf("%d\n", ans);
return 0;
}