Poj OpenJudge 百练 1062 昂贵的聘礼

1.Link:

http://poj.org/problem?id=1062

http://bailian.openjudge.cn/practice/1062/

2.Content:

昂贵的聘礼

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 37631   Accepted: 10872

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

Source

浙江

3.Method:

dijkstra算法的应用,这题还增加了等级的考虑,我使用的枚举,然后运用算法前直接排除掉等级不符合要求的

4.Code:

  1 #include <iostream>
  2 #include <cstring>
  3 #include <limits>
  4 #include <cstdlib>
  5 #include <cmath>
  6
  7 using namespace std;
  8
  9 int intMax = numeric_limits<int>::max();
 10
 11 int main()
 12 {
 13     //freopen("D://input.txt","r",stdin);
 14     int i,j, k, ii;
 15
 16     int m, n;
 17     cin >> m >> n;
 18     //cout << m << " " << n << endl;
 19
 20     int **arr_map = new int*[n];
 21     for(i = 0; i < n; ++i)
 22     {
 23         arr_map[i] = new int[n];
 24         for(j = 0; j < n; ++j) arr_map[i][j] = intMax;
 25     }
 26
 27     int *arr_p = new int[n];
 28     int *arr_L = new int[n];
 29
 30     int p,L,x;
 31     for(i = 0; i < n; ++i)
 32     {
 33         cin >> p >> L >> x;
 34         arr_p[i] = p;
 35         arr_L[i] = L;
 36
 37         int t,v;
 38         for(j = 0; j < x; ++j)
 39         {
 40             cin >> t >> v;
 41             arr_map[t - 1][i] = v;
 42         }
 43     }
 44
 45     //for(j = 0; j < n; ++j)
 46     //{
 47     //    for(k = 0; k < n; ++k) cout << arr_map[j][k] << " ";
 48     //    cout << endl;
 49     //}
 50     //cout << endl;
 51
 52     int min_p = arr_p[0];
 53
 54     int *arr_d = new int[n];
 55     bool *arr_m = new bool[n];
 56
 57     int **arr_map2 = new int*[n];
 58     for(i = 0; i < n; ++i) arr_map2[i] = new int[n];
 59
 60     for(i = 1; i < n; ++i)
 61     {
 62         for(ii = 0; ii <= m; ++ii)
 63         {
 64             int l_bettom = arr_L[i] - m + ii;
 65             int l_top = arr_L[i] + ii;
 66
 67             for(j = 0; j < n; ++j) memcpy(arr_map2[j], arr_map[j], sizeof(int) * n);
 68             for(j = 0; j < n; ++j)
 69             {
 70                 /*if(abs(arr_L[j] - arr_L[i]) > m)
 71                 {
 72                     for(k = 0; k < n; ++k)
 73                     {
 74                         arr_map2[k][j] = intMax;
 75                         arr_map2[j][k] = intMax;
 76                     }
 77                 }*/
 78                 if(arr_L[j] < l_bettom || arr_L[j] > l_top)
 79                 {
 80                     for(k = 0; k < n; ++k)
 81                     {
 82                         arr_map2[k][j] = intMax;
 83                         arr_map2[j][k] = intMax;
 84                     }
 85                 }
 86             }
 87
 88             //for(j = 0; j < n; ++j)
 89             //{
 90             //    for(k = 0; k < n; ++k) cout << arr_map2[j][k] << " ";
 91             //    cout << endl;
 92             //}
 93             //cout << endl;
 94
 95             memcpy(arr_d, arr_map2[i], sizeof(int) * n);
 96             memset(arr_m, 0 ,sizeof(bool) * n);
 97
 98             arr_d[i] = 0;
 99             arr_m[i] = true;
100
101             for(j = 1; j < n; ++j)
102             {
103                 int min_d = intMax;
104                 int idx_d;
105
106                 for(k = 0; k < n; ++k)
107                 {
108                     if(!arr_m[k] && min_d > arr_d[k])
109                     {
110                         min_d = arr_d[k];
111                         idx_d = k;
112                     }
113                 }
114                 if(min_d == intMax) break;
115
116                 arr_m[idx_d] = true;
117                 for(k = 0; k < n; ++k)
118                 {
119                     if(!arr_m[k] && arr_map2[idx_d][k] != intMax && min_d + arr_map2[idx_d][k] < arr_d[k])
120                     {
121                         arr_d[k] = min_d + arr_map2[idx_d][k];
122                     }
123                 }
124
125                 //for(k = 0; k < n; ++k) cout << arr_d[k] << " ";
126                 //cout << endl;
127             }
128
129             if(arr_d[0] != intMax && min_p > arr_d[0] + arr_p[i]) min_p = arr_d[0] + arr_p[i];
130         }
131     }
132
133     cout << min_p << endl;
134
135     for(i = 0; i < n; ++i) delete [] arr_map2[i];
136     delete [] arr_map2;
137
138     delete [] arr_m;
139     delete [] arr_d;
140
141     delete [] arr_L;
142     delete [] arr_p;
143
144     for(i = 0; i < n; ++i) delete [] arr_map[i];
145     delete [] arr_map;
146
147
148     return 0;
149 }

5.Reference:

时间: 2024-10-09 16:03:17

Poj OpenJudge 百练 1062 昂贵的聘礼的相关文章

Poj OpenJudge 百练 1860 Currency Exchang

1.Link: http://poj.org/problem?id=1860 http://bailian.openjudge.cn/practice/1860 2.Content: Currency Exchange Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 20706   Accepted: 7428 Description Several currency exchange points are working

Poj OpenJudge 百练 2602 Superlong sums

1.Link: http://poj.org/problem?id=2602 http://bailian.openjudge.cn/practice/2602/ 2.Content: Superlong sums Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 22337   Accepted: 6577 Description The creators of a new programming language D++

Poj OpenJudge 百练 2389 Bull Math

1.Link: http://poj.org/problem?id=2389 http://bailian.openjudge.cn/practice/2389/ 2.Content: Bull Math Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13067   Accepted: 6736 Description Bulls are so much better at math than the cows. The

Poj OpenJudge 百练 1573 Robot Motion

1.Link: http://poj.org/problem?id=1573 http://bailian.openjudge.cn/practice/1573/ 2.Content: Robot Motion Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 10856   Accepted: 5260 Description A robot has been programmed to follow the instru

Poj OpenJudge 百练 2632 Crashing Robots

1.Link: http://poj.org/problem?id=2632 http://bailian.openjudge.cn/practice/2632/ 2.Content: Crashing Robots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7912   Accepted: 3441 Description In a modernized warehouse, robots are used to

Poj OpenJudge 百练 Bailian 1008 Maya Calendar

1.Link: http://poj.org/problem?id=1008 http://bailian.openjudge.cn/practice/1008/ 2.content: Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 66971   Accepted: 20644 Description During his last sabbatical, professor M. A. Ya

poj 1062 昂贵的聘礼 (dijkstra最短路)

题目链接:http://poj.org/problem?id=1062 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 36799   Accepted: 10616 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的

POJ - 1062昂贵的聘礼最短路或者DFS

POJ - 1062 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %I64d & %I64u Submit Status Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如

POJ 1062 昂贵的聘礼 最短路

Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5000金币就行了."探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格.探险家于是又跑到其他地方,其他人也提出了类似的要求