triangle

来源:互联网 发布:淘宝王小说 编辑:程序博客网 时间:2024/04/30 00:47

水题加一,然后。。。。各种TLE,,,最后用了一种其丑无比的方法高空擦边而过。。。。

嗯。。。。说明有的时候剪枝还是挺有用的样纸。。。。

#include <stdio.h>#include <iostream>using namespace std;#define maxn 100010int a[maxn],sum[maxn];template<class T>inline char read(T &n){    T x = 0, tmp = 1; char c = getchar();    while((c < '0' | c > '9') && c != '-' && c != EOF) c = getchar();    if(c == '-') c = getchar(), tmp = -1;    while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();    n = x*tmp;    return c;}int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        int i,j,k;        for(i=0;i<n;i++)        {           // scanf("%d",&a[i]);           read(a[i]);            if(i==0) sum[i]=a[i];            else sum[i]=sum[i-1]+a[i];        }        if(sum[n-1]%3) {printf("0\n");continue;}        int len=sum[n-1]/3;        int tmp=0,tmpp;        int ans=0;        j=k=0;        int l,r;        for(i=0;i<n;i++)        {            if(sum[i]>=len&&!j) {j=1;l=i;continue;}            if(sum[i]>=2*len&&!k) {k=1;r=i;break;}        }        tmpp=r;        for(i=l;i<=r;i++)        {            for(j=tmp;j<l;j++)            {                if(sum[i]-sum[j]==len) break;            }            if(sum[i]-sum[j]==len)            {                for(k=tmpp;k<n;k++) if(sum[k]-sum[i]==len) break;            }            if(sum[k]-sum[i]==len) {ans++;tmp=j;tmpp=k;}        }        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击