pat甲级1044
记录一下pat刷题历程
注意点
-
刚开始写的时候每次都从头开始求和,然后理所当然地超时了,然后翻了一下算法笔记,借鉴了书上把从第1个结点到第n个结点的距离储存到sum数组中的方法
2.在没有刚好相加等于给定值的情况下,要输出相加最接近给定值的解,所以一定要遍历两遍
###代码(渣渣代码)
#include
#include
using namespace std;
const int maxn=100500;
int dia[maxn];
int s[maxn]={0};
int minNum=500000;
int bin_search(int l,int r,int x){
int temp=l;
while(l<=r){
int mid=(l+r)/2;
int num=s[mid]-s[temp-1];
if(numx){
return mid;
}else if(num>x) {
if(num-x<minNum)
minNum=num-x;
r=mid-1;
}else{
l=mid+1;
}
}
return -1;
}
int bin_search1(int m,int l,int r,int x){
int temp=l;
while(l<=r){
int mid=(l+r)/2;
int num=s[mid]-s[temp-1];
if(num-xm){
return mid;
}else if(num>x+m) {
r=mid-1;
}else{
l=mid+1;
}
}
return -1;
}
int main(){int N,M;
int flag=0;//是否有找到刚好的串
scanf("%d%d",&N,&M);
for (int i=1;i<=N;i++){
scanf("%d",&dia[i]);
s[i]+=s[i-1]+dia[i];
}
for (int i=1;i<=N;i++){
int res=bin_search(i,N,M);
if(res!=-1){
printf("%d-%d\n",i,res);
flag=1;
}}
if(flag==0){
for (int i=1;i<=N;i++){
int res=bin_search1(minNum,i,N,M);
if(res!=-1){
printf("%d-%d\n",i,res);
flag=1;
}}
}
return 0;
}