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. P1802 5倍经验日(01背包问题,水题)

    题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却无奈的看着那一些比他等级高的好友,想着能否把他们干掉.干掉能拿不少经验的. 题目描述 现在absi2011拿出了x个迷你装药物 ...

  2. nginx跟apache访问方法

    ifconfig 在浏览器中输入ip即可访问 centos安装nginx环境 1:进入 cd /usr/local/src  //下载文件放到这个目录中 2:wget http://nginx.org ...

  3. DNS攻击

    DNS攻击 实验是基于Linux系统,配置了bind9服务的机器 大纲 本地修改Host文件重定向路径到指定地址 对User的DNS查询进行欺骗攻击 在同一局域网下,对DNS服务器的DNS查询进行欺骗 ...

  4. leetcode 235. Lowest Common Ancestor of a Binary Search Tree 236. Lowest Common Ancestor of a Binary Tree

    https://www.cnblogs.com/grandyang/p/4641968.html http://www.cnblogs.com/grandyang/p/4640572.html 利用二 ...

  5. 文件上传之Servlet

    导包 commons-fileupload-1.3.1.jar commons-io-2.2.jar import java.io.File; import java.io.FileOutputStr ...

  6. Centos 7 KVM安装win10

    KVM架构: KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案.KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 L ...

  7. HIS系统结算后,没有更新单据状态为“已结算”

    1.由于查询单据有个参数:时间,而应用服务器和数据库服务器存在时间差,经比对,数据库服务器时间要快7秒 2.应用服务器查询单据,根据当前时间去查,但是由于数据库服务器要快7秒,导致查询不出数据. 总结 ...

  8. 使用SatelliteMenu创建动画菜单

    一.GitHub地址:https://github.com/chenshouyin/SatelliteMenu 二.使用步骤: 第一步:在Android Studio中创建一个项目,然后在Androi ...

  9. root密码重置(Centos 7)

    1.系统启动时出现操作系统的选择界面,按e进入grub编辑模式. 2.选择linux16开头这一行在最后加上  \re.break 按ctrl+x 3.进入switch-root:# 输入 mount ...

  10. java算法----排序----(6)希尔排序(最小增量排序)

    package log; public class Test4 { /** * java算法---希尔排序(最小增量排序) * * @param args */ public static void ...