题意:
输入 n m 之后输入n个数
之后m个询问 对于每个询问 输入一个t 输出 三个数 ans l r 表示从l 到 r的所有数的和的绝对值最接近t 且输出这个和ans
思路:就是指针的移动。
AC代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<limits.h> using namespace std; pair<int,int>p[100005]; int n,m,t,num; void find(int x) { int i=0,j=1,ans=INT_MAX,temp,l,r,v; while(j<=n && ans) { temp=p[j].first-p[i].first; if(abs(temp-x)<=ans) { ans=abs(temp-x); v=temp; l=p[i].second; r=p[j].second; } if(temp<x) j++; if(temp>x) i++; if(i==j) j++; } if(l>r) { int a=r; r=l; l=a; } printf("%d %d %d\n",v,l+1,r); } int main() { while(scanf("%d%d",&n,&m)==2 && (m+n)) { int sum=0; p[0]=make_pair(0,0); for(int i=1; i<=n; i++) { scanf("%d",&num); sum+=num; p[i]=make_pair(sum,i); } sort(p,p+n+1); while(m--) { scanf("%d",&t); find(t); } } return 0; }
时间: 2024-10-12 13:45:34