Pascal & C++——NOIP模拟题——小X分砖块

来源:互联网 发布:刚开的淘宝店怎么做 编辑:程序博客网 时间:2024/06/05 19:34
小X分砖块 
问题描述 
    小X喜欢跟着爸爸跑到建筑工地上去。 
    这天,小X看到一排砖,每块要么是白色的(0),要么是黑色的(1)。小X想把这排 
砖分成若干非空段,使得每段白砖和黑砖块数的比例相同。 
    当然,小X可以直接把整排砖作为一段,那就太简单了。为了增加难度,小X想知道最 
多能分成多少段,例如 
    100011= 10+ 0011 (即样例1,最多分成2段,比例为1:1); 
    0001110000000001=0001+11000000+0001 (即样例2,最多分成3段,比例为3:1)。 
    小X百思不得其解,希望你帮帮他。 


输入格式 
    第一行包含一个整数N。我们将用N行来描述这排砖,初始时这排砖为空。 
    接下来N行,每行包含用一个空格隔开的两个整数Ki,Ci (Ci只可能是0或1),表示 
在上一行描述完后尾部又有了Ki块颜色为Ci的砖。 


输出格式 
    第一行包含一个整数,表示最多能分成的段数。 


样例输入1 

11 
30 
2 1 


样例输出1 



样例输入2 

30 
3 1 
9 0 
11 


样例输出2 



数据范围 
    对于30%的数据,N=1。 
    对于60%的数据,所有Ki均相等。 

    对于100%的数据,1≤N≤100000,1≤Ki≤1000000000,砖的总块数不超过1000000000。

#include<cstdio>#include<vector>using namespace std;int main(){freopen("brick.in","r",stdin);freopen("brick.out","w",stdout);int n,ans=0,w,e;scanf("%d",&n);vector <int> a;vector <int> b;long long s[2]={0};int t[2]={0};for(int i=0;i<n;++i){scanf("%d%d",&w,&e);a.push_back(w);b.push_back(e);s[b[i]]+=a[i];}if(!s[0]||!s[1]){printf("%d\n",s[0]+s[1]);return 0;}for(int i=0;i<n;++i){int x=b[i],y=b[i]^1;if(s[y]&&!(s[x]*t[y]%s[y])){int z=s[x]*t[y]/s[y]-t[x];if(z>=1&&z<=a[i]) ++ans;}t[x]+=a[i];}printf("%d\n",ans);return 0;}

varn,ans,i,x,y,z:longint;a,b:array [0..100001] of longint;s,t:array [0..2] of int64;begin        assign(input,'brick.in');        assign(output,'brick.out');        reset(input);        rewrite(output);        read(n);        for i:=0 to n-1 do begin        read(a[i],b[i]);        s[b[i]]:=s[b[i]]+a[i];        end;        if (s[0]=0)or(s[1]=0) then begin        write(s[0]+s[1]);        exit();        end;        for i:=0 to n-1 do begin                x:=b[i];                if x=1 then y:=0 else y:=1;                if (s[y]<>0)and((s[x]*t[y] mod s[y])=0) then begin                        z:=s[x]*t[y] div s[y];                        z:=z-t[x];                        if (z>=1)and(z<=a[i]) then ans:=ans+1;                end;                t[x]:=t[x]+a[i];        end;        write(ans);        close(input);        close(output);end.


原创粉丝点击