zoukankan      html  css  js  c++  java
  • Supermarket POJ

    先将n个物品按价值降序排个序,从头扫到尾,对于每一个物品i,判断能不能在<=di的最大时间点卖掉。

    #include<stdio.h>
    #include<algorithm>
    #include<iostream>
    #include<string.h>
    using namespace std;
    const int maxn=1e4+10;
    struct node
    {
        int p,d;
    }th[maxn];
    int fa[maxn];//fa[i]表示的是i时刻的状态,-1为未被占用
    bool cmp(const node&a,const node&b)
    {
        return a.p>b.p;
    }
    int ifind(int x)
    {
        if(fa[x]==-1)
            return x;
        return fa[x]=ifind(fa[x]);  
    }
    int main() 
    {
        int n,ans;
        while(scanf("%d",&n)!=EOF)
        {
            ans=0;
            memset(fa,-1,sizeof(fa));//
            for(int i=0;i<n;i++)
                scanf("%d%d",&th[i].p,&th[i].d);
            sort(th,th+n,cmp);
            for(int i=0;i<n;i++)
            {
                int t=ifind(th[i].d);//找可以卖掉第i个物品的时间点
                if(t>0) //t从1开始,t=0,则是非法的时间点
                {
                    ans+=th[i].p;
                    fa[t]=t-1; //这个语句表示t时间点的下一个合法时间点要从t-1开始找
                }
    
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    
  • 相关阅读:
    .net中Timer的使用
    计算日期的神器
    求全排列函数next_permutation
    各种排序
    求最大字段和
    炸弹时间复位
    最少步数,广搜
    数据
    水池数目
    最大岛屿
  • 原文地址:https://www.cnblogs.com/eason9906/p/11754866.html
Copyright © 2011-2022 走看看