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 (<=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的更多相关文章
- PAT甲级——A1044 Shopping in Mars
Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diam ...
- A1044 Shopping in Mars (25 分)
一.技术总结 可以开始把每个数都直接相加当前这个位置的存放所有数之前相加的结果,这样就是递增的了,把i,j位置数相减就是他们之间数的和. 需要写一个函数用于查找之间的值,如果有就放返回大于等于这个数的 ...
- 1044 Shopping in Mars (25 分)
1044 Shopping in Mars (25 分) Shopping in Mars is quite a different experience. The Mars people pay b ...
- PAT 甲级 1044 Shopping in Mars
https://pintia.cn/problem-sets/994805342720868352/problems/994805439202443264 Shopping in Mars is qu ...
- 1044 Shopping in Mars
Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diam ...
- PAT 1044 Shopping in Mars[二分][难]
1044 Shopping in Mars(25 分) Shopping in Mars is quite a different experience. The Mars people pay by ...
- pat1044. Shopping in Mars (25)
1044. Shopping in Mars (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Shop ...
- PAT 甲级 1044 Shopping in Mars (25 分)(滑动窗口,尺取法,也可二分)
1044 Shopping in Mars (25 分) Shopping in Mars is quite a different experience. The Mars people pay ...
- PTA(Advanced Level)1044.Shopping in Mars
Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diam ...
随机推荐
- 【精】【入门篇】js正则表达式
前言 最近有了点时间,就回头看了一下<学习正则表达式>这本书.怎么说呢,这本书适合从零开始学习正则表达式或者有一点基础但是想要加强这方面能力的读者.这本书的风格是“实践出真知”,使用归纳方 ...
- mybatis 思考
https://my.oschina.net/xianggao/blog/548579 https://my.oschina.net/xianggao/blog/548873 https://my.o ...
- kill方法
删除磁盘上的文件. 语法 Kill 路径名 所需的_路径名_参数是一个字符串表达式,指定要删除的一个或多个文件名. _Pathname_可能包括驱动器和目录或文件夹. 例子删除当前路径下的TXT文档 ...
- C-数据结构-typedef的用法
.typedef的用法 # include <stdio.h> typedef int zhang; //为数据类为int从新取名为zhang 等价于int typedef struct ...
- 11.13 Daily Scrum
今天在实现餐厅列表时,原来使用的百度地图poi搜索接口无法返回餐厅的具体信息. 经过一番周折,找到了一个返回餐厅url的接口.我们调整了一下实现,在点击餐厅列表的某一项点击直接跳到和该餐厅信息有关的网 ...
- [Beta]M2事后分析
计划 你原计划的工作是否最后都做完了? 如果有没做完的,为什么? 答:没有,全部的功能没有实现.其中,界面还差两个,逻辑还差闹钟逻辑和群组逻辑,可以说这些东西是我们的核心功能之一,缺失了他们对我们整个 ...
- [BUAA软工]第一次博客作业---阅读《构建之法》
[BUAA软工]第一次博客作业 项目 内容 这个作业属于哪个课程 北航软工 这个作业的要求在哪里 第1次个人作业 我在这个课程的目标是 学习如何以团队的形式开发软件,提升个人软件开发能力 这个作业在哪 ...
- sqoop 使用笔记
好久没有更新自己技术博客,现在开始工作了,把自己遇到的问题写到这里边来 主要把自己的问题写出来,分享给大家 sqoop 导入数据时候 有时候会遇到mysql 中有sql 中的关键字 这时候如果直接导出 ...
- 第三个Sprint冲刺第九天(燃尽图)
- HDOJ2007_平方和与立方和
应该注意到一个细节是题目中没有说明输入的两个数据一定是先小后大的关系,所以需要做一次判断.其他的比较简单. HDOJ2007_平方和与立方和 #include<iostream> #inc ...