POJ 1456 Supermarket

来源:互联网 发布:越南旅游 知乎 编辑:程序博客网 时间:2024/04/30 15:21

这道题,并查集+贪心。

用f [ i ] 表示 小于等于 i 的最大的可用的天数。

先将商品按价值排序,然后从价值最高的开始先放,从截止日期开始往前放,即放在 f [ deadline ] 的地方。

int n;int f[10001];struct goods{int value,deadline;bool operator <(const goods&b)const{return value<b.value;}}good[10001];
定义了结构体,重载小于运算符,方便排序。

int get(int a){if(a<1) return 0;int r=a;while(r!=f[r]){r=f[r];}return f[a]=r;}

get函数,查找小于等于a的最大空缺位置。

int main(void){while(scanf("%d",&n)!=EOF){for(int i=1;i<=10000;i++) f[i]=i; //并查集初始化 int pi,di;FOR(i,n) {scanf("%d%d",&pi,&di);good[i].value=pi;good[i].deadline=di;}sort(good+1,good+n+1);//排序 int ANS=0;for(int i=n;i>0;--i){int pos=get(good[i].deadline);f[pos]=get(pos-1);if(pos) ANS+=good[i].value;//如果找到位置放,就加上它的价值。 }cout<<ANS<<endl;}return 0;}


0 0
原创粉丝点击