PAT(甲级)1044
来源:互联网 发布:ios leancloud数据库 编辑:程序博客网 时间:2024/06/04 19:49
1044. Shopping in Mars (25)
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 153 2 1 5 4 6 8 7 16 10 15 11 9 12 14 13Sample Output 1:
1-54-67-811-11Sample Input 2:
5 132 4 5 7 9Sample Output 2:
2-44-5
#include <iostream>#define SIZE 100005using namespace std;///////////////////////////////////////////////////////////// version2// this method is relatively hard to implement,please refer to others//////////////////////////////////////////////////////////struct Iterm{int start;int end;};int a[SIZE];Iterm record[SIZE];/////////////////////////////////////////////////////////////////////////////////////////////////i:starting position of array[]//remain: remove a[i], the sum left//value:standard value, here is M//n: the number of array[]//flag: indicate whether find a element bigger than M// this function is of key importance, for it can eliminate the repeated iteration////////////////////////////////////////////////////////////////////////////////////////int fun(int i,unsigned long &remain,int value,int n,bool &flag){ //return the termination positionif(remain >= value){ //to avoid case such as 1 2 3 4 16 while to get 15 etcreturn i-1;} for(int j=i;j<n;j++){if(a[j] >= value){remain = a[j]; //reset remain if find a element bigger than valueflag = true;return j;}remain += a[j];if(remain >= value) return j;}}int main(){int i,j,k,N,M;//freopen("test.txt","r",stdin);scanf("%d%d",&N,&M);for(i=0;i<N;i++) scanf("%d",&a[i]);unsigned long tmp=-1,sum=0;k=0;bool found=false;j = 0;for(i=0;i<N;i++){ //sum is the accumulated sum of a[i],a[i+1]...a[j]bool flag =false;j = fun(j,sum,M,N,flag); //the function stops when the sum is larger than or equal to Mif(sum == M){found = true;if(flag){printf("%d-%d\n",j+1,j+1);} else printf("%d-%d\n",i+1,j+1);}else if(sum > M && sum <= tmp & !found){if(sum < tmp) k=0;if(flag){record[k].start = j+1;} else record[k].start = i+1;record[k].end = j+1;k++;tmp = sum;}if(flag) i = j;sum -= a[i];j++; }if(!found){ for(i=0;i<k;i++) printf("%d-%d\n",record[i].start,record[i].end);}//fclose(stdin);return 0;}
- PAT(甲级)1044
- *浙大PAT甲级 1044
- PAT甲级1044
- PAT甲级 1044
- pat甲级1044
- PAT 甲级
- PAT甲级 A1025.PAT RANKING
- PAT 甲级 1025 PAT Ranking
- PAT(甲级)1003
- PAT(甲级)1004
- PAT(甲级)1005
- PAT(甲级)1006
- PAT(甲级)1007
- PAT(甲级)1008
- PAT(甲级)1009
- PAT(甲级)1010
- PAT(甲级)1011
- PAT(甲级)1012
- HDU - 1087 Super Jumping! Jumping! Jumping!(DAG)
- hdu3555(数位dp)
- iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)
- mongoDB 3.0 安全权限访问控制
- 无技术实用调试技巧
- PAT(甲级)1044
- 2600:War
- ubuntu git安装
- ASP.NET中的几种弹出框提示基本实现方法
- Fliter设置字符编码,解决中文问题
- 快速开发一个PHP扩展
- JavaWeb学习笔记之表单数据处理类
- PAT(甲级)1045
- CAS 自定义数据源