2019 GDUT Rating Contest I : Problem G. Back and Forth

Posted happy-medge

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019 GDUT Rating Contest I : Problem G. Back and Forth相关的知识,希望对你有一定的参考价值。

题面:

G. Back and Forth

Input ?le: standard input
Output ?le: standard output
Time limit: 1 second
Memory limit: 256 megabytes
 
Farmer John has two milking barns, each of which has a large milk tank as well as a storage closet containing 10 buckets of various sizes. He likes to carry milk back and forth between the two barns as a means of exercise. On Monday, Farmer John measures exactly 1000 gallons of milk in the tank of the ?rst barn, and exactly 1000 gallons of milk in the tank of the second barn.

On Tuesday, he takes a bucket from the ?rst barn, ?lls it, and carries the milk to the second barn, where he pours it into the storage tank. He leaves the bucket at the second barn.

On Wednesday, he takes a bucket from the second barn (possibly the one he left on Tuesday), ?lls it, and carries the milk to the ?rst barn, where he pours it into the storage tank. He leaves the bucket at the ?rst barn.

On Thursday, he takes a bucket from the ?rst barn (possibly the one he left on Wednesday), ?lls it, and carries the milk to the second barn, where he pours it into the tank. He leaves the bucket at the second barn.

On Friday, he takes a bucket from the second barn (possibly the one he left on Tuesday or Thursday), ?lls it, and carries the milk to the ?rst barn, where he pours it into the tank. He leaves the bucket at the ?rst barn.

Farmer John then measures the milk in the tank of the ?rst barn. How many possible di?erent readings could he see?
 
Input
The ?rst line of input contains 10 integers, giving the sizes of the buckets initially at the ?rst barn. The second line of input contains 10 more integers, giving the sizes of the buckets initially at the second barn. All bucket sizes are in the range 1...100.
 
Output
Please print the number of possible readings Farmer John could get from measuring the milk in the tank of the ?rst barn after Friday.
 
Example
Input
1 1 1 1 1 1 1 1 1 2
5 5 5 5 5 5 5 5 5 5
Output
5
 
Note
In this example, there are 5 possible results for the ?nal amount of milk in the ?rst barn’s tank:
  • 1000: FJ could carry the same bucket back and forth in each trip, leaving the total amount in the ?rst barn’s tank unchanged. 
  • 1003: FJ could carry 2 units on Tuesday, then 5 units on Wednesday, then 1 unit on Thursday, and 1 unit on Friday.
  • 1004: FJ could carry 1 unit on Tuesday, then 5 units on Wednesday, then 1 unit on Thursday, and 1 unit on Friday.
  • 1007: FJ could carry 1 unit on Tuesday, then 5 units on Wednesday, then 2 units on Thursday, and 5 units on Friday.
  • 1008: FJ could carry 1 unit on Tuesday, then 5 units on Wednesday, then 1 unit on Thursday, and 5 units on Friday.

题目描述:

农夫有两个奶牛棚,两个奶牛棚分别有一个牛奶缸和十个桶。两个牛奶缸刚开始都有1000加仑的牛奶。每过一天,农夫就会带一个桶从牛奶缸装满牛奶,走到另一个奶牛棚,然后把牛奶倒进这个牛奶棚牛奶缸。问过了这几天后,第一个牛奶缸可能有多少牛奶的情况的总数。
 

题目分析:

这道题我们直接模拟就可以了,题目数据不大。但是为了更好的简洁代码,我们还是分析一下题目有什么性质:
题目会有三种情况:
1.没有改变:
技术图片技术图片
技术图片技术图片
2.四天只有其中两天“交换”了桶:
技术图片技术图片
技术图片技术图片
3.四天中都“交换”了桶:
技术图片技术图片
技术图片技术图片
从上面我们可以看到,牛奶缸的变化量取决于“交换”的桶的差值。所以,我们在模拟的过程中记录桶的差值就可以得出有多少种情况,能达到某种情况就记录下来。
我们可以用c++ stl set来记录我们获得的情况(不知道为什么用数组记录不行??)。
 
对于第二种情况,前两天“交换”桶,后两天不“交换”桶 与 前两天不“交换”桶,后两天“交换”桶得到的情况是一样的。为了方便,我们只记录前者就行了。总的代码就是实现“交换”两次桶,用简单的循环就即可搞定。
 
 
AC代码:
 1 #include <cstdio>
 2 #include <iostream>
 3 #include <set>
 4 using namespace std;
 5 const int maxn = 1e4;
 6 int a[15], b[15];
 7 set<int> ans;
 8 
 9 int main(){
10     for(int i = 0; i < 10; i++) cin >> a[i];
11     for(int i = 0; i < 10; i++) cin >> b[i];
12 
13     ans.insert(1000);   //第一种情况
14     int d1, d2, t;
15     for(int i = 0; i < 10; i++){
16         for(int j = 0; j < 10; j++){
17             d1 = b[j]-a[i];   //差值
18 
19             //交换桶
20             t = a[i];
21             a[i] = b[j];
22             b[j] = t;
23 
24 
25             for(int k = 0; k < 10; k++){
26                 for(int p = 0; p < 10; p++){
27                     d2 = b[p]-a[k];    //第二次不用交换, 直接算差值
28                     ans.insert(1000+d1+d2);   //第三种情况
29                 }
30             }
31             ans.insert(1000+d1);  //第二种情况
32 
33             //换回来
34             t = a[i];
35             a[i] = b[j];
36             b[j] = t;
37 
38         }
39     }
40 
41     cout << ans.size() << endl;
42     return 0;
43 }

 

 
 

以上是关于2019 GDUT Rating Contest I : Problem G. Back and Forth的主要内容,如果未能解决你的问题,请参考以下文章

HDU 2018 Multi-University Training Contest 3 Problem A. Ascending Rating 单调队列优化

hdu 6319 Problem A. Ascending Rating (2018 Multi-University Training Contest 3)

hdu 6319 Problem A. Ascending Rating (2018 Multi-University Training Contest 3 A)

2018 Multi-University Training Contest 3 1001 / hdu6319 Problem A. Ascending Rating 单调队列,思维

GDUT决赛题解

Gdut Count