zoukankan      html  css  js  c++  java
  • 昂贵的聘礼(poj 1062)

    Description

    年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长降低要求。酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币。如果你能够弄来他的水晶球,那么只要5000金币就行了。"探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格。探险家于是又跑到其他地方,其他人也提出了类似的要求,或者直接用金币换,或者找到其他东西就可以降低价格。不过探险家没必要用多样东西去换一样东西,因为不会得到更低的价格。探险家现在很需要你的帮忙,让他用最少的金币娶到自己的心上人。另外他要告诉你的是,在这个部落里,等级观念十分森严。地位差距超过一定限制的两个人之间不会进行任何形式的直接接触,包括交易。他是一个外来人,所以可以不受这些限制。但是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是间接接触,反过来也一样。因此你需要在考虑所有的情况以后给他提供一个最好的方案。 
    为了方便起见,我们把所有的物品从1开始进行编号,酋长的允诺也看作一个物品,并且编号总是1。每个物品都有对应的价格P,主人的地位等级L,以及一系列的替代品Ti和该替代品所对应的"优惠"Vi。如果两人地位等级差距超过了M,就不能"间接交易"。你必须根据这些数据来计算出探险家最少需要多少金币才能娶到酋长的女儿。 

    Input

    输入第一行是两个整数M,N(1 <= N <= 100),依次表示地位等级差距限制和物品的总数。接下来按照编号从小到大依次给出了N个物品的描述。每个物品的描述开头是三个非负整数P、L、X(X < N),依次表示该物品的价格、主人的地位等级和替代品总数。接下来X行每行包括两个整数T和V,分别表示替代品的编号和"优惠价格"。

    Output

    输出最少需要的金币数。

    Sample Input

    1 4
    10000 3 2
    2 8000
    3 5000
    1000 2 1
    4 200
    3000 2 1
    4 200
    50 2 0
    

    Sample Output

    5250

    “但是如果他和某个地位较低的人进行了交易,地位较高的的人不会再和他交易,他们认为这样等于是间接接触,反过来也一样。"这句话真的没有什么卵用,坑死我了!!!
    附我的DFS强力代码:
    /*
      DFS不解释,另外什么等级高与低之间不能交易没有用,坑死了!!! 
      rank是该物品主人的等级
      mon是该用于交换物品的现金
      vis访问标记
      xia是该物品是否能用别的物品交换
      a[i][j]是i物品用j物品替代后还需花多少钱 
    */
    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #define M 110
    #define INF 10000
    using namespace std;
    int rank[M],mon[M],vis[M],xia[M],a[M][M],k,n,ans=INF;
    void dfs(int x,int t,int l,int r)
    {
        if(t>ans)return;
        ans=min(ans,t+mon[x]);
        if(!xia[x])return;
        for(int i=1;i<=n;i++)
          if(!vis[i]&&a[x][i]&&rank[i]>=l&&rank[i]<=r)
          {
              int ll=max(l,rank[i]-k);
              int rr=min(r,rank[i]+k);
              vis[i]=1;
              dfs(i,t+a[x][i],ll,rr);
              vis[i]=0;
          }
    }
    int main()
    {
        scanf("%d%d",&k,&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d%d",&mon[i],&rank[i],&xia[i]);
            for(int j=1;j<=xia[i];j++)
            {
                int x;
                scanf("%d",&x);
                scanf("%d",&a[i][x]);
            }
        }
        vis[1]=0;
        dfs(1,0,rank[1]-k,rank[1]+k);
        printf("%d",ans);
        return 0;
    } 
    View Code
    
    
  • 相关阅读:
    一个网卡绑定多个IP和多个网卡用一个ip的设置
    Linux操纵细碎以太网卡的装配及设置2
    教你若何制作软盘版的 Linux系统防火墙
    Ubuntu Linux体系中装置GNOME初步劈脸菜单
    构筑Linux防火墙之集团用户设置防火墙1
    Linux系统Iptables端方执行按次过细讲解
    Proxy源代码分析 谈Linux收集编程身手
    Linux使用系统以太网卡的安装及设置装备陈设1
    操持Linux下Oracle Tomcat 8080端口争持2
    Linux操作体系上差别文件体系的兼容成就
  • 原文地址:https://www.cnblogs.com/harden/p/5628316.html
Copyright © 2011-2022 走看看