这道题刚开始读错题目还以为超级水体,后来发现是一道贪心~
可能是数据太水了,用了很简单粗暴的贪心就过了。
先贴上贪心,后面再来试别的方法好了,举一反三咯。
一共贴了三种不同的代码,前面两个是贪心,最后面是第二种的并查集优化版
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e4+5;
const int inf = 0x3f3f3f3f;
int father[maxn],n;
int maxx(int x,int y) {
int t = x > y ? x : y;
return t;
}
struct pro {
int p,t;
} num[maxn];
bool tmp(pro x,pro y) {
if(x.t == y.t)
return x.p < y.p;
return x.t < y.t;
}
int main() {
while(~scanf("%d",&n)) {
int d[maxn];
memset(d,0,sizeof(d));
for(int i = 0;i < n;i++) {
scanf("%d%d",&num[i].p,&num[i].t);
}
sort(num,num+n,tmp);
for(int i = 0;i < n;i++) {
int minn = inf,k;
for(int j = 1;j <= num[i].t;j++) {
if(d[j] <= minn)
minn = d[k = j];
}
d[k] = num[i].p;
}
int ans = 0;
for(int i = 1;i <= 10000;i++)
ans += d[i];
printf("%d\n",ans);
}
}
吃完饭再贴一个按照物品价格从大到小先排好序,然后再从截至日期往前推,找到可以卖的并且标记好。这样又优化不少,从400+ms到141ms,~哈哈
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e4+5;
const int inf = 0x3f3f3f3f;
struct pro {
int p,t;
} num[maxn];
bool tmp(pro x,pro y) {
if(x.p == y.p)
return x.t > y.t;
return x.p > y.p;
}
int main() {
int n;
while(~scanf("%d",&n)) {
int d[maxn];
memset(d,0,sizeof(d));
for(int i = 0;i < n;i++)
scanf("%d%d",&num[i].p,&num[i].t);
sort(num,num+n,tmp);
int ans = 0;
for(int i = 0;i < n;i++)
for(int j = num[i].t;j > 0;j--) {
if(!d[j]) {
//printf("%d****\n",num[i].p);
d[j] = num[i].p;
ans += d[j];
break;
}
}
printf("%d\n",ans);
}
}
终于发现了并查集的用处!!用并查集优化了以后居然63ms就过了~哈哈
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e4+5;
const int inf = 0x3f3f3f3f;
int father[maxn];
struct pro {
int p,t;
} num[maxn];
bool tmp(pro x,pro y) {
if(x.p == y.p)
return x.t > y.t;
return x.p > y.p;
}
int query(int x) { //路径压缩真心重要
if(x != father[x])
father[x] = query(father[x]);
return father[x];
}
int main() {
int n;
while(~scanf("%d",&n)) {
int d[maxn];
memset(d,0,sizeof(d));
for(int i = 0;i <= 10000;i++)
father[i] = i;
for(int i = 0;i < n;i++)
scanf("%d%d",&num[i].p,&num[i].t);
sort(num,num+n,tmp);
int ans = 0;
for(int i = 0;i < n;i++)
for(int j = num[i].t;j > 0;j = query(j)) {
if(!d[j]) {
//printf("%d****\n",num[i].p);
d[j] = num[i].p;
ans += d[j];
break;
}
else
father[j] = j-1;
}
printf("%d\n",ans);
}
}
加油了~