1、S所以从as+1开始总和最初超过S的连续子序列如果是as+1+.+at1的话,则必然有tt。用下面的图来解释比较清晰:#includecstdiocmathalgorithm#define sf scanf#define pf printfusing name space std;const int Maxn = 100010;int T,n,s;int sumMaxn;int main() int a; sf(%d,&T); while(T-) int tail = -1,head = -1;%d%dn,&s); for(int i = 0;i = s) tail = i; if(tail
2、= -1) pf(0n); continue; int Min = n; while(head =s) head +; Min = min(Min,tail - head); else if(tail setmap#define MAX 1000010#define LL long long#define INF 0x3f3f3f3fint aMAX;map cnt;set t;int p, ans = INF, st, en, sum;int main() scanf(, &p); for (int i = 0; i p; i+)scanf(, a+i), t.insert(ai); int
3、 num = t.size(); while (1) while (enp &sumnum) if (cntaen+ = 0)sum+; if (sum num) break; ans = min(ans, en-st); if (-cntast+ = 0) sum-; printf(, ans);POJ 2566给定一个数组和一个值t,求一个子区间使得其和的绝对值与t的差值最小,如果存在多个,任意解都可行。明显,借用第一题的思路,既然要找到一个子区间使得和最接近t的话,那么不断地找比当前区间的和更大的区间,如果区间和已经大于等于t了,那么不需要在去找更大的区间了,因为其和与t的差值更大,然后
4、区间左端点向右移动推进即可。所以,首先根据计算出所有的区间和,排序之后按照上面的思路求解即可。#define MAX 100010typedef pairLL aMAX, t, ans, tmp, b;int n, k, l, u, st, en;p sumMAX;LL myabs(LL x) return x=0? x:-x; while (scanf(%d %dk), n+k) sum0 = p(0, 0); for (int i = 1;= n; i+)%I64d, a+i); sumi = p(sumi-1.first+ai,i); sort(sum, sum+1+n); while
5、(k-)t); tmp = INF; st = 0, en = 1; while(en = n) b =sumen.first-sumst.first; if(myabs(t-b) t) st+; else if(b t) en+; else break; if(st = en) en+; if (u typedef long long LL;const int Maxn = 4010;int AMaxn,BMaxn,CMaxn,DMaxn;int ABMaxn * Maxn,CDMaxn * Maxn;int n;LL solved(int val) int l = 0, r = n * n
6、 - 1; LL ans; while(l = r) int mid = (l + r) / 2; if(CDmid = val) l = mid + 1; r = mid - 1; ans = r; l = 0, r = n * n - 1; val) ans = ans - r; return ans; while(sf(n)i+)sf(%d%d%d%dAi,&Bi,&Ci,&Di); int cnt = 0; for(int j = 0;j j +) ABcnt = Ai + Bj,CDcnt+= Ci + Dj; sort(CD,CD + cnt); LL ans = 0; ans +
7、= solved(0 - ABi);%lldn,ans);POJ 3977给你一个含n(n=35)个数的数组,让你在数组中选出一个非空子集,使其元素和的绝对值最小,输出子集元素的个数以及元素和的绝对值,若两个子集元素和相等,输出元素个数小的那个。思路:如果直接暴力枚举,复杂度O(2n),n为35时会超时,故可以考虑折半枚举,利用二进制将和以及元素个数存在两个结构体数组中,先预判两个结构体是否满足题意,再将其中一个元素和取相反数后排序,因为总元素和越接近零越好,再二分查找即可,用lower_bound时考虑查找到的下标和他前一个下标,比较元素和以及元素个数,不断更新即可。struct Zlong
8、 long int x;int y;bool operator (const Z& b)const if(x!=b.x) return x b.x; return yb.y;a300005,b300005;long long int c40;long long int abs1(long long int x)if(xn)&n!=0) for(int i=0;ici; int n1=n/2;1n1;i+) for(int j=0;jj&1&(i!=0|j!=0) ai-1.x+=cj; ai-1.y+; int n2=n-n1;(1n2);n2; bi-1.x+=cj+n1; bi-1.y+;
9、n1)-1; if(abs1(ai.x)sum) sum=abs1(ai.x); ans=ai.y; elseif(abs1(ai.x)=sum&ai.yans)for(inti=0; ai.x=-ai.x;n2)-1; if(abs1(bi.x) sum=abs1(bi.x); ans=bi.y; else if(abs1(bi.x)=sum&bi.y sort(a,a+(1n1)-1); sort(b,b+(1n2)-1); int t=lower_bound(b,b+(10) if(abs1(bt-1.x-ai.x) sum=abs1(bt-1.x-ai.x); ans=bt-1.y+ai.y; else if(abs1(bt-1.x-ai.x)=sum&bt-1.y+ai.y if(tn2)-1) if(abs1(bt.x-ai.x) sum=abs1(bt.x-ai.x); ans=bt.y+ai.y; else if(abs1(bt.x-ai.x)=sum&bt.y+ai.ycoutansendl;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1