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 (<=105), the total number of diamonds on the chain, and M (<=108), the amount that the customer has to pay. Then the next line contains N positive numbers D1 ... DN (Di<=103 for all i=1, ..., N) 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 > M with (Di + ... + Dj - M) 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<cstdio>
#include<iostream>
using namespace std;
long long diamond[], sum[];
int binSearch1(long long diamond[], long long sum[], int low, int high, long long x){
int mid, start = low;
long long pay;
while(low <= high){
mid = low + (high - low) / ;
pay = sum[mid] - sum[start] + diamond[start];
if(pay == x)
return mid;
else if(pay > x)
high = mid - ;
else low = mid + ;
}
return -;
}
int binSearch2(long long diamond[], long long sum[], int low, int high, long long x, long long &ans){
int mid, start = low;
long long pay = ;
while(low < high){
mid = low + (high - low) / ;
pay = sum[mid] - sum[start] + diamond[start];
if(pay >= x)
high = mid;
else low = mid + ;
}
pay = sum[low] - sum[start] + diamond[start];
ans = pay;
return low;
}
int main(){
long long N, M, temp = , ans, min = ;
int cut;
scanf("%lld%lld", &N, &M);
for(int i = ; i < N; i++){
scanf("%lld", &diamond[i]);
temp += diamond[i];
sum[i] = temp;
}
int find = ;
for(int i = ; i < N; i++){
cut = binSearch1(diamond, sum, i, N - , M);
if(cut != -){
printf("%d-%d\n", i + , cut + );
find = ;
}
}
if(find == ){
for(int i = ; i < N; i++){
cut = binSearch2(diamond, sum, i, N, M, ans);
if (ans < min && cut != N)
min = ans;
}
for(int i = ; i < N; i++){
cut = binSearch2(diamond, sum, i, N, M, ans);
if(sum[cut] - sum[i] + diamond[i] == min)
printf("%d-%d\n", i + , cut + , ans);
}
}
cin >> N;
return ;
}

总结:

1、题意:给出一串数字,找出它们的一个子序列使得这个子序列的和刚好等于M。如果找不到,则找一个序列使得它的和大于M但又比其它大于M的序列的和小,如果这个序列有多个,则全部输出。 可以发现暴力破解会超时,只能二分解决。由于二分要求查找的序列是有序的,可以用diamond数组记录这些数字,sum数组记录这个序列的和,其中sum[ i ]表示diamond[0] 到 diamond[ i ]的和。在计算 i 到 j 的和时,直接sum[ j ] - sum[ i ] + diamond[ i ] 即可。且sum序列为递增。

2、二分法查找第一个满足某条件的元素,最后返回的是 low,有效结果也是low而非mid!

3、可以使用p、q双指针法来求和。pq之间序列即为所求。当和过大时,ans - num[p], p++; 当和太小时, q++, ans + num[q];

A1044. Shopping in Mars的更多相关文章

  1. PAT甲级——A1044 Shopping in Mars

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

  2. A1044 Shopping in Mars (25 分)

    一.技术总结 可以开始把每个数都直接相加当前这个位置的存放所有数之前相加的结果,这样就是递增的了,把i,j位置数相减就是他们之间数的和. 需要写一个函数用于查找之间的值,如果有就放返回大于等于这个数的 ...

  3. 1044 Shopping in Mars (25 分)

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

  4. PAT 甲级 1044 Shopping in Mars

    https://pintia.cn/problem-sets/994805342720868352/problems/994805439202443264 Shopping in Mars is qu ...

  5. 1044 Shopping in Mars

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

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

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

  7. pat1044. Shopping in Mars (25)

    1044. Shopping in Mars (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Shop ...

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

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

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

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

随机推荐

  1. 【精】【入门篇】js正则表达式

    前言 最近有了点时间,就回头看了一下<学习正则表达式>这本书.怎么说呢,这本书适合从零开始学习正则表达式或者有一点基础但是想要加强这方面能力的读者.这本书的风格是“实践出真知”,使用归纳方 ...

  2. python基础学习笔记(七)

    本章介绍如何将语句组织成函数,这样,可以告诉计算机如何做事. 下面编写一小段代码计算婓波那契数列(前两个数的和是第三个数) fibs = [0,1] # 定义一个列表,初始内容是0,1 for i i ...

  3. Python进阶量化交易专栏场外篇7- 装饰器计算代码时间

    欢迎大家订阅<教你用 Python 进阶量化交易>专栏!为了能够提供给大家更轻松的学习过程,笔者在专栏内容之外已陆续推出一些手记来辅助同学们学习本专栏内容,目前已推出如下扩展篇: 在第一篇 ...

  4. c++入门之关于cin,cout以及数据流的认识

  5. Week 1 工程表格

    PSP2.1 Personal Software Process Stages Time Planning 计划 · Estimate · 估计这个任务需要多少时间 6h30min Developme ...

  6. 第九次Scrum meeting

    第九次Scrum  meeting 任务及完成度: 成员 12.31 1.1 陈谋 任务1040:完成stackoverflow的数据处理后的json处理(99%) 任务1114-1:完成对网页数据的 ...

  7. eclipse新建maven项目,修改默认jdk版本

    我们新建maven项目,默认jdk版本是1.5,我们可以修改成我们想要的版本,有两种方法 1每个项目修改,在pom.xml添加 <build> <plugins> <!- ...

  8. PHP使用Redis实现消息队列

    消息队列可以使用MySQL来实现,可以参考博客PHP使用MySQL实现消息队列,虽然用MySQL可以实现,但是一般不这么用,因为MySQL的数据都存在硬盘中,而从硬盘中对MySQL的操作,I/O花费的 ...

  9. Ajax进阶 FormData对象

    Ajax基础:http://www.cnblogs.com/-beyond/p/7919369.html xhr 2.0及FormData介绍 FormData对象 其实和 XMLHttpReques ...

  10. Activiti流程编辑器针对自定义用户角色表优化改造

    本文目的: 针对自定义的用户.角色表,对Activiti的在线流程设计器进行优化改造,使之能直接在图形界面上完成对节点办理人.候选人.候选组的配置,不需要先去查数据库中的用户ID.角色ID等信息再填入 ...