https://pintia.cn/problem-sets/994805342720868352/problems/994805439202443264

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

代码:

#include <bits/stdc++.h>
using namespace std; const int maxn = 1e5 + 10;
int N, M, K;
int minn = 99999;
int num[maxn], sum[maxn]; vector<int> BinarySearch(int key) {
vector<int> rec;
for(int i = 1; i <= N; i ++) {
int L = i, R = N, mid;
while(L <= R) {
mid = (L + R) / 2;
if(sum[mid] - sum[i - 1] == key) {
rec.push_back(i);
rec.push_back(mid);
break;
}
else if(sum[mid] - sum[i - 1] > key)
R = mid - 1;
else L = mid + 1;
}
}
return rec;
} int main() {
memset(sum, 0, sizeof(sum));
scanf("%d%d", &N, &M);
for(int i = 1; i <= N; i ++) {
scanf("%d", &num[i]);
sum[i] = sum[i - 1] + num[i];
} vector<int> ans = BinarySearch(M);
if(ans.size()) {
for(int i = 0; i < ans.size(); i ++) {
if(i % 2 == 0) printf("%d-", ans[i]);
else printf("%d\n", ans[i]);
}
} else {
for(int i = 1; i <= N; i ++) {
int l = i, r = N, midd;
while(l <= r) {
midd = (l + r) / 2;
int temp = sum[midd] - sum[i - 1];
if(temp - M < 0) l = midd + 1;
else if(temp - M > 0)
r = midd - 1; if(temp > M) minn = min(minn, temp);
}
} vector<int> res = BinarySearch(minn);
for(int i = 0; i < res.size(); i ++) {
if(i % 2 == 0) printf("%d-", res[i]);
else printf("%d\n", res[i]);
}
}
return 0;
}

  求前缀和 然后二分

PAT 甲级 1044 Shopping in Mars的更多相关文章

  1. PAT 甲级 1044 Shopping in Mars (25 分)(滑动窗口,尺取法,也可二分)

    1044 Shopping in Mars (25 分)   Shopping in Mars is quite a different experience. The Mars people pay ...

  2. PAT甲级——A1044 Shopping in Mars

    Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diam ...

  3. PAT Advanced 1044 Shopping in Mars (25) [⼆分查找]

    题目 Shopping in Mars is quite a diferent experience. The Mars people pay by chained diamonds. Each di ...

  4. PAT 1044 Shopping in Mars[二分][难]

    1044 Shopping in Mars(25 分) Shopping in Mars is quite a different experience. The Mars people pay by ...

  5. 1044 Shopping in Mars (25 分)

    1044 Shopping in Mars (25 分) Shopping in Mars is quite a different experience. The Mars people pay b ...

  6. pat甲级1044二分查找

    1044 Shopping in Mars(25 分) Shopping in Mars is quite a different experience. The Mars people pay by ...

  7. 1044 Shopping in Mars

    Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diam ...

  8. PTA(Advanced Level)1044.Shopping in Mars

    Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diam ...

  9. 1044 Shopping in Mars (25 分)

    Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diam ...

随机推荐

  1. sahrepoint 上传到文档库

    sharepoint学习笔记汇总 http://blog.csdn.net/qq873113580/article/details/20390149         /// <summary&g ...

  2. MyCat不适用场景(使用时避免)

    1.非分片字段查询 Mycat中的路由结果是通过分片字段和分片方法来确定的.例如下图中的一个Mycat分库方案: ·        根据 tt_waybill 表的 id 字段来进行分片 ·      ...

  3. [HAOI2017]供给侧改革

    题目 这道题我们其实就是利用了一棵后缀树 由于字符串是随机的,所以这个后缀树的树高是\(log\)的,基于树高的算法是能过的 我们考虑后缀树上的两个节点的\(lca\)就是这两个节点所代表的后缀的\( ...

  4. jquery $("[id$='d']").val();这句话什么意思?

    获得id后缀为d字符的值.应该是属于input标签.谢谢 匹配给定的属性是以某些值结尾的元素,比如<span id="ad">test</span>< ...

  5. Qt 编程指南10 QImage Mat QPixmap转换

      //示例 pushButtonOpenPicBig按钮clicked单击动作触发 void Qt_Window::on_pushButtonOpenPicBig_clicked() { strin ...

  6. Guide to Porting MetaMask to a New Environment

    https://github.com/MetaMask/metamask-extension/blob/develop/docs/porting_to_new_environment.md MetaM ...

  7. Qt5.9一个简单的多线程实例(类QThread)(第一种方法)

    Qt开启多线程,主要用到类QThread.有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run().当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程 ...

  8. 升级pip后出现ImportError: cannot import name main

    https://blog.csdn.net/accumulate_zhang/article/details/80269313

  9. PAT A1075 PAT Judge (25 分)——结构体初始化,排序

    The ranklist of PAT is generated from the status list, which shows the scores of the submissions. Th ...

  10. 【Codeforces 848C】Goodbye Souvenir

    Codeforces 848 C 题意:给\(n\)个数,\(m\)个询问,每一个询问有以下类型: 1 p x:将第p位改成x. 2 l r:求出\([l,r]\)区间中每一个出现的数的最后一次出现位 ...