PAT甲级——A1044 Shopping in Mars

Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diamond has a value (in Mars dollars M$). When making the payment, the chain can be cut at any position for only once and some of the diamonds are taken off the chain one by one. Once a diamond is off the chain, it cannot be taken back. For example, if we have a chain of 8 diamonds with values M$3, 2, 1, 5, 4, 6, 8, 7, and we must pay M$15. We may have 3 options:

  1. Cut the chain between 4 and 6, and take off the diamonds from the position 1 to 5 (with values 3+2+1+5+4=15).
  2. Cut before 5 or after 6, and take off the diamonds from the position 4 to 6 (with values 5+4+6=15).
  3. Cut before 8, and take off the diamonds from the position 7 to 8 (with values 8+7=15).

Now given the chain of diamond values and the amount that a customer has to pay, you are supposed to list all the paying options for the customer.

If it is impossible to pay the exact amount, you must suggest solutions with minimum lost.

Input Specification:

Each input file contains one test case. For each case, the first line contains 2 numbers: N (≤), the total number of diamonds on the chain, and M (≤), the amount that the customer has to pay. Then the next line contains N positive numbers D?1???D?N?? (D?i??≤10?3?? for all ,) which are the values of the diamonds. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print i-j in a line for each pair of i ≤ j such that Di + ... + Dj = M. Note that if there are more than one solution, all the solutions must be printed in increasing order of i.

If there is no solution, output i-j for pairs of i ≤ j such that Di + ... + Dj > with (Di + ... + Dj −) minimized. Again all the solutions must be printed in increasing order of i.

It is guaranteed that the total value of diamonds is sufficient to pay the given amount.

Sample Input 1:

16 15
3 2 1 5 4 6 8 7 16 10 15 11 9 12 14 13

Sample Output 1:

1-5
4-6
7-8
11-11

Sample Input 2:

5 13
2 4 5 7 9

Sample Output 2:

2-4
4-5

【题意】

给出一个数字序列与一个数S,在数字序列中求出所有和值为S的连续子序列(区间下标左端点小的先输出,左端点相同时右端点小的先输出)。若没有这样的序列,求出和值恰好大于S的子序列(即在所有和值大于S的子序列中和值最接近S)。假设序列下标从1开始。

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 //暴力解法,复杂度为O(N),没通过测试,超时
 5 int N, M;
 6 vector<int>value,sum;
 7 vector<pair<int, int>>res, minRes;//res存刚好切割值等于付款值,min存切割值为最小的
 8 void Way1()
 9 {
10     int minV = M;
11     for (int i = 1; i <= N; ++i)
12     {
13         int s = 0;
14         for (int j = i; j <= N; ++j)
15         {
16             s += value[j];
17             if (s < M)continue;
18             else if (s == M)
19                 res.push_back(make_pair(i, j));
20             else if (s > M)
21             {
22                 if (minV == (s - M))
23                     minRes.push_back(make_pair(i, j));
24                 else if (minV > (s - M))
25                 {
26                     minV = s - M;
27                     minRes.clear();
28                     minRes.push_back(make_pair(i, j));
29                 }
30             }
31             break;
32         }
33     }
34 }
35 //方法二,使用二分法
36 int upper_bound(int L, int &tempS)
37 {
38     int left = L, right = N, mid;
39     while (left < right)
40     {
41         mid = (left + right) / 2;
42         if (sum[mid]-sum[L-1] >= M)
43             right = mid;
44         else
45             left = mid + 1;
46     }
47     tempS = sum[right] - sum[L - 1];
48     return right;
49 }
50
51 void Way2()
52 {
53     int minV = sum[N], tempS;
54     for (int i = 1; i <= N; ++i)//左端
55     {
56         int j = upper_bound(i, tempS);
57         if (tempS >minV)continue;
58         else if (tempS >= M)
59         {
60             if (tempS < minV)
61             {
62                 res.clear();
63                 minV = tempS;
64             }
65             res.push_back(make_pair(i, j));
66         }
67     }
68 }
69
70 int main()
71 {
72     cin >> N >> M;
73     value.resize(N + 1);
74     sum.resize(N + 1);
75     for (int i = 1; i <= N; ++i)
76     {
77         cin >> value[i];
78         sum[i] = sum[i - 1] + value[i];
79     }
80     Way2();
81     if (res.size() > 0)
82         for (auto a : res)
83             cout << a.first << "-" << a.second << endl;
84     else
85         for (auto a : minRes)
86             cout << a.first << "-" << a.second << endl;
87     return 0;
88 }

原文地址:https://www.cnblogs.com/zzw1024/p/11261909.html

时间: 2024-07-29 22:23:24

PAT甲级——A1044 Shopping in Mars的相关文章

A1044. Shopping in Mars (25)

Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diamond has a value (in Mars dollars M$). When making the payment, the chain can be cut at any position for only once and some of the diamonds are taken o

PAT A1044 Shopping in Mars [二分]

题目描述 链接 求一串的数字中连续的一段,使得这个连续的段内数字的和恰好等于所期望的值m.如果不能找到恰好等于,就找让自己付出最少的价格(总和必须大于等于所给值)的那段区间.求所有可能的结果 分析 输出区间和等于指定值的方案,可以先统计前缀和,然后作差就可以得到区间和 原本错误的做法:作差得到区间和,保存在node数组里面,然后再排序,然后再二分查找.实际没用,因为最大的复杂度是\(O(n^2)\) 正解应该是:因为本来前缀和就是递增的,可以枚举区间左端点,再二分查找区间右端点,使得区间和=m,

PAT 甲级 1027 Colors in Mars (20 分)

1027 Colors in Mars (20 分) People in Mars represent the colors in their computers in a similar way as the Earth people. That is, a color is represented by a 6-digit number, where the first 2 digits are for Red, the middle 2 digits for Green, and the

PAT 甲级 1027 Colors in Mars (20 分)(简单,进制转换)

1027 Colors in Mars (20 分) People in Mars represent the colors in their computers in a similar way as the Earth people. That is, a color is represented by a 6-digit number, where the first 2 digits are for Red, the middle 2 digits for Green, and the

PAT 甲级 A1044 (2019/02/20)

#include<cstdio> const int MAXN = 100010; int sum[MAXN]; int n, S, nearS = 100000010; int upper_bound(int L, int R, int x) { int left = L, right = R, mid; while(left < right) { mid = (left + right) / 2; if(sum[mid] > x) { right = mid; } else {

Pat(Advanced Level)Practice--1044(Shopping in Mars)

Pat1044代码 题目描述: Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diamond has a value (in Mars dollars M$). When making the payment, the chain can be cut at any position for only once and some of the diam

PAT甲级1005 Spell It Right

题目:PAT甲级 1005 题解:水题.看到题目的第一时间就在想一位一位的mod,最后一加一转换就完事了.结果看到了N最大为10的100的次方,吓得我赶紧放弃这个想法... 发现碰到这种情况用字符串十分好用,这道题应该考察的就是这一点.大致思路就是把数字的每一位放到字符串中,然后通过ASCII码得到每一位的相加结果num,然后把num一位一位的放到stack中,使用stack是因为它先进先出的特性,最后输出就行了. 代码: 1 #include<cstdio> 2 #include<qu

1044. Shopping in Mars (25)

时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diamond has a value (in Mars dollars M$). When making the payment, the chain can be cu

PAT1044. Shopping in Mars

Shopping in Mars is quite a different experience.  The Mars people pay by chained diamonds.  Each diamond has a value (in Mars dollars M$).  When making the payment, the chain can be cut at any position for only once and some of the diamonds are take