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. [UWP 自定义控件]了解模板化控件(4):TemplatePart

    1. TemplatePart TemplatePart(部件)是指ControlTemplate中的命名元素.控件逻辑预期这些部分存在于ControlTemplate中,并且使用protected ...

  2. Centos下安装破解Jira7的操作记录

    Jira是一个集项目计划.任务分配.需求管理.错误跟踪于一体的工具,可以作为一个bug管理系统,可以将在测试过程中所发现的bug录入.分配给开发人员.前面介绍了Confluence在Centos下的安 ...

  3. Nginx+Tomcat+Memcached部署

    环境清单列表:(因为只有三台电脑,所有把Nginx和memcached放到一起) 应用服务器1:192.168.51.10: 应用服务器2:192.168.55.110: memcached服务器:1 ...

  4. 个人作业——final

    一 . 对M1M2的一个总结 我特别感谢我们组的PM.以前我觉得女生学计算机这个专业,跟男生比差太远了.总觉得我们女生就是上上课写写作业考考试还行,但是一到开发什么项目啊,实战之类的,总觉得自己的能力 ...

  5. 同步手绘板——android端下笔后颜色变化

    实现效果 : 在设计之初我们以为是改变笔线条的粗细来实现类似效果,后来通过找其他相关软件比对发现是不改变线条的粗细,通过改变透明度实现下笔后颜色的渐变,虽然已实现,但渐变效果很一般,不流畅,算法还待优 ...

  6. 结对项目gobang

    题目介绍:实现五子棋的基本规则,分黑棋和白棋.连成5个的胜利,完成了五子棋的单人游戏. 代码地址:https://github.com/liuxianchen/gobang 结对人:刘仙臣  康佳 结 ...

  7. Maximal GCD CodeForces - 803C (数论+思维优化)

    C. Maximal GCD time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  8. PAT 1049 数列的片段和

    https://pintia.cn/problem-sets/994805260223102976/problems/994805275792359424 给定一个正数数列,我们可以从中截取任意的连续 ...

  9. MYSQL CASCADE DELETE 引发的思考

    MYSQL CASCADE DELETE :级联删除.这个概念还是学习Oracle时得到的. 就是主键记录删除时,相关的有外键的表里的记录,也删除. https://dev.mysql.com/doc ...

  10. Appium学习笔记2_Android获取元素篇

    在利用Appium做自动化测试时,最重要的一步就是获取对应的元素值,根据元素来对对象进行对应的操作,如果获得对象元素呢? Appium Server Console其实提供了一个界面对话框" ...