HDU 3268 Columbus’s bargain

Columbus’s bargain

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 1829    Accepted Submission(s): 465

Problem Description

On the evening of 3 August 1492, Christopher Columbus departed from Palos de la Frontera with a few ships, starting a serious of voyages of finding a new route to India. As you know, just in those voyages, Columbus discovered the America continent which he
thought was India.

Because the ships are not large enough and there are seldom harbors in his route, Columbus had to buy food and other necessary things from savages. Gold coins were the most popular currency in the world at that time and savages also accept them. Columbus wanted
to buy N kinds of goods from savages, and each kind of goods has a price in gold coins. Columbus brought enough glass beads with him, because he knew that for savages, a glass bead is as valuable as a gold coin. Columbus could buy an item he need only in four
ways below:

1.  Pay the price all by gold coins.

2.  Pay by ONE glass bead and some gold coins. In this way, if an item’s price is k gold coins, Columbus could just pay k – 1 gold coins and one glass bead.

3.  Pay by an item which has the same price.

4.  Pay by a cheaper item and some gold coins.

Columbus found out an interesting thing in the trade rule of savages: For some kinds of goods, when the buyer wanted to buy an item by paying a cheaper item and some gold coins, he didn’t have to pay the price difference, he can pay less. If one could buy an
item of kind A by paying a cheaper item of kind B plus some gold coins less than the price difference between B and A, Columbus called that there was a “bargain” between kind B and kind A. To get an item, Columbus didn’t have to spend gold coins as many as
its price because he could use glass beads or took full advantages of “bargains”. So Columbus wanted to know, for any kind of goods, at least how many gold coins he had to spend in order to get one – Columbus called it “actual price” of that kind of goods.

Just for curiosity, Columbus also wanted to know, how many kinds of goods are there whose “actual price” was equal to the sum of “actual price” of other two kinds.

Input

There are several test cases.

The first line in the input is an integer T indicating the number of test cases ( 0 < T <= 10).

For each test case:

The first line contains an integer N, meaning there are N kinds of goods ( 0 < N <= 20). These N kinds are numbered from 1 to N.

Then N lines follow, each contains two integers Q and P, meaning that the price of the goods of kind Q is P. ( 0 <Q <=N, 0 < P <= 30 )

The next line is a integer M( 0 < M <= 20 ), meaning there are M “bargains”.

Then M lines follow, each contains three integers N1, N2 and R, meaning that you can get an item of kind N2 by paying an item of kind N1 plus R gold coins. It’s guaranteed that the goods of kind N1 is cheaper than the goods of kind N2 and R is none negative
and less than the price difference between the goods of kind N2 and kind N1. Please note that R could be zero.

Output

For each test case:

Please output N lines at first. Each line contains two integers n and p, meaning that the “actual price” of the goods of kind n is p gold coins. These N lines should be in the ascending order of kind No. .

Then output a line containing an integer m, indicating that there are m kinds of goods whose “actual price” is equal to the sum of “actual price” of other two kinds.

Sample Input

1
4
1 4
2 9
3 5
4 13
2
1 2 3
3 4 6

Sample Output

1 3
2 6
3 4
4 10
1

题意:告诉n个物品以及购买每个物品需要的金币数量,对于每个物品,可以且只可以用一个玻璃球来进行代替一个金币,等价的物品之间可以相互交换,告诉a,b,c三个数,b物品可以用a物品加上c个金币来进行交换,求每个货物最少需要多少个金币,以及有多少个货物能够用其他两个货物来进行代替交换。

思路:可以抽象成为最短路问题, 把每个货物看成一个端点,设置一个0点,0到i的权值就是第i个物品的价格,于是可以用floyd求解最短路的方式来求出每个端点最小的价格

#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <cmath>
#include <queue>
#define INF 99999999
using namespace std;

int T;

int val;
int mp[1009][1009];

int main()
{
    scanf("%d",&T);
    int k;
    int n;
    int a,b,c;

    while(T--)
    {
        scanf("%d",&n);
       for(int i=0;i<=n;i++)
           for(int j=0;j<=n;j++)
           {
               if(i==j) mp[i][j]=0;
               mp[i][j]=INF;
           }

        for(int i=1;i<=n;i++)
        {
            scanf("%d %d",&k,&val);
            mp[0][i]=val-1;
        }

        scanf("%d",&k);
        for(int i=0;i<k;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            mp[a][b]=c;
        }

        for(int i=0;i<=n;i++)//存在等价交换
            for(int j=0;j<=n;j++)
        {
            if(mp[0][i]==mp[0][j])
                mp[i][j]=mp[j][i]=0;
        }

        for(int k=0;k<=n;k++)
            for(int i=0;i<=n;i++)
                for(int j=0;j<=n;j++)
                    mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);

        for(int i=1;i<=n;i++)
            printf("%d %d\n",i,mp[0][i]);

        int ans=0;
        for(int i=1;i<=n;i++)
        {
            int flag=0;
            for(int j=1;j<=n;j++)
            {
                if(i==j) continue;
                for(int k=1;k<=n;k++)
                {
                    if(j==k || i==k) continue;
                    if(mp[0][i]==mp[0][j]+mp[0][k])
                    {
                        flag=1;
//                        cout<<"i="<<i<<" ";
//                        cout<<"j="<<j<<" "<<"k="<<k<<endl;
                    }

                }
            }
            if(flag)
            ans++;
        }

        printf("%d\n",ans);

    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 00:52:35

HDU 3268 Columbus’s bargain的相关文章

HDU 3268 Columbus’s bargain(最短路 Spfa)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3268 Problem Description On the evening of 3 August 1492, Christopher Columbus departed from Palos de la Frontera with a few ships, starting a serious of voyages of finding a new route to India. As you k

Columbus’s bargain (hdu 3268 最短路)

Columbus's bargain Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1836    Accepted Submission(s): 467 Problem Description On the evening of 3 August 1492, Christopher Columbus departed from Pa

Columbus’s bargain

Columbus’s bargain Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1721    Accepted Submission(s): 431 Problem Description On the evening of 3 August 1492, Christopher Columbus departed from Pal

hdu 3268 09 宁波 现场 I - Columbus’s bargain

Description On the evening of 3 August 1492, Christopher Columbus departed from Palos de la Frontera with a few ships, starting a serious of voyages of finding a new route to India. As you know, just in those voyages, Columbus discovered the America

图论 500题——主要为hdu/poj/zoj

转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并查集======================================[HDU]1213   How Many Tables   基础并查集★1272   小希的迷宫   基础并查集★1325&&poj1308  Is It A Tree?   基础并查集★1856   More i

HDU 2665(主席树,无修改第k小)

Kth number                                                 Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)                                                                        Total Submission(s): 10682    Accep

hdu图论题目分类

=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many Tables 基础并查集★ 1272 小希的迷宫 基础并查集★ 1325&&poj1308 Is It A Tree? 基础并查集★ 1856 More is better 基础并查集★ 1102 Constructing Roads 基础最小生成树★ 1232 畅通工程 基础并查集★ 123

hdu 3264 Open-air shopping malls(求圆相交的面积,二分)

Open-air shopping malls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2256    Accepted Submission(s): 837 Problem Description The city of M is a famous shopping city and its open-air shopping

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;