糖果传递 HAOI 2008 tuyvj 1924

来源:互联网 发布:网络打假教程 编辑:程序博客网 时间:2024/06/06 06:44

洛谷 P2512 糖果传递
这有一篇博客分析的很好,就转载一下吧。
http://hzwer.com/2656.html
程序代码

#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>using namespace std;int n,a[1000001],c[1000001],ave;long long sum,ans;int main(){    scanf("%d",&n);    for(register int i=1;i<=n;++i) scanf("%d",&a[i]),sum+=a[i];    ave=sum/n;    for(int i=1;i<=n;++i) c[i]=c[i-1]+a[i]-ave;    sort(1+c,1+c+n);    int mid=c[(n>>1)+1];    for(int i=1;i<=n;++i) ans+=abs(c[i]-mid);    printf("%lld",ans);    return 0;} 

tyvj 1924 七夕祭
跟上面那一题差不多,只不过是二维的,但我们可以将二维转化成一维。

#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<queue>#include<vector>#include<map>#include<cstdlib>#define pa pair<int,int>#define inf 1000000000#define linf 9000000000000000000LL#define ll long longusing namespace std;inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}int n,m,T;int x[100005],y[100005];int a[100005],b[100005];ll s1[100005],s2[100005],ans;void solve(){    ll t;    if(T%n==0)    {        for(int i=1;i<=n;i++)               s1[i]=s1[i-1]+x[i];        sort(s1+1,s1+n+1);        t=s1[(n+1)>>1];        for(int i=1;i<=n;i++)            ans+=abs(t-s1[i]);    }    if(T%m==0)    {        for(int i=1;i<=m;i++)            s2[i]=s2[i-1]+y[i];        sort(s2+1,s2+m+1);        t=s2[(m+1)>>1];        for(int i=1;i<=m;i++)            ans+=abs(t-s2[i]);    }}int main(){    freopen("romantic6.in","r",stdin);    freopen("romantic.out","w",stdout);    n=read();m=read();T=read();    for(int i=1;i<=T;i++)    {        int a=read(),b=read();        x[a]++;y[b]++;//分别转化成行,列的一维即可    }    if(T%n&&T%m)    {        puts("impossible");        return 0;    }    for(int i=1;i<=n;i++)x[i]-=T/n;    for(int i=1;i<=m;i++)y[i]-=T/m;    solve();    if(T%n==0&&T%m==0)printf("both ");    //两个都行的情况就是将上面两个所得到的之都相加即可    else if(T%n==0)printf("row ");    else printf("column ");    printf("%lld\n",ans);    return 0;}

小结:反正我当时考试的时候想到了转一维,但是不会上面那道题,所以就按照洛谷均分纸牌(为加强版的做法做了),对的点很少(这都过了?数据太水了吧)。