zoukankan      html  css  js  c++  java
  • BZOJ3032 七夕祭[中位数]

    发现是一个类似于“纸牌均分”的问题。然后发现,只要列数整除目标、行数整除目标就一定可以。

    如果只移动列,并不会影响行,也就是同一行不会多不会少。只移动行同理。

    所以可以把两个问题分开来看,处理起来互不干扰。

    然后就是一个经典的“环形纸牌均分”问题做两次即可。

    注意细节:如果有两个相邻的点,由题意,他们交换其实是浪费的,这表明,是否某列有点要向相邻列移动时没法过去?事实上发现是不会出现这种情况的。。可以分类(大于平均/小于平均)外加贪心来说明这一点。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<queue>
     7 #define mst(x) memset(x,0,sizeof x)
     8 #define dbg(x) cerr << #x << " = " << x <<endl
     9 #define dbg2(x,y) cerr<< #x <<" = "<< x <<"  "<< #y <<" = "<< y <<endl
    10 using namespace std;
    11 typedef long long ll;
    12 typedef double db;
    13 typedef pair<int,int> pii;
    14 template<typename T>inline T _min(T A,T B){return A<B?A:B;}
    15 template<typename T>inline T _max(T A,T B){return A>B?A:B;}
    16 template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,1):0;}
    17 template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,1):0;}
    18 template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
    19 template<typename T>inline T read(T&x){
    20     x=0;int f=0;char c;while(!isdigit(c=getchar()))if(c=='-')f=1;
    21     while(isdigit(c))x=x*10+(c&15),c=getchar();return f?x=-x:x;
    22 }
    23 const int N=1e5+7;
    24 int a1[N],a2[N],s[N];
    25 int n,m,t,cl,ro;
    26 ll ans;
    27 
    28 int main(){//freopen("test.in","r",stdin);//freopen("test.ans","w",stdout);
    29     read(n),read(m),read(t);
    30     for(register int i=1,x,y;i<=t;++i)read(x),read(y),++a1[y],++a2[x];
    31     if(t%m==0){
    32         cl=1;int ave=t/m,mid=m+1>>1;s[1]=0;
    33         for(register int i=2;i<=m;++i)s[i]=s[i-1]+ave-a1[i];
    34         sort(s+1,s+m+1);
    35         for(register int i=1;i<=m;++i)ans+=abs(s[mid]-s[i]);
    36     }
    37     if(t%n==0){
    38         ro=1;int ave=t/n,mid=n+1>>1;s[1]=0;
    39         for(register int i=2;i<=n;++i)s[i]=s[i-1]+ave-a2[i];
    40         sort(s+1,s+n+1);
    41         for(register int i=1;i<=n;++i)ans+=abs(s[mid]-s[i]);//dbg(s[i]);
    42     }
    43     if(ro&&cl)printf("both %lld
    ",ans);
    44     else if(ro)printf("row %lld
    ",ans);
    45     else if(cl)printf("column %lld
    ",ans);
    46     else puts("impossible");
    47     return 0;
    48 }
    View Code
  • 相关阅读:
    poj 3280 Cheapest Palindrome(区间DP)
    POJ 2392 Space Elevator(多重背包)
    HDU 1285 定比赛名次(拓扑排序)
    HDU 2680 Choose the best route(最短路)
    hdu 2899 Strange fuction (三分)
    HDU 4540 威威猫系列故事――打地鼠(DP)
    HDU 3485 Count 101(递推)
    POJ 1315 Don't Get Rooked(dfs)
    脱离eclipse,手动写一个servlet
    解析xml,几种方式
  • 原文地址:https://www.cnblogs.com/saigyouji-yuyuko/p/11812387.html
Copyright © 2011-2022 走看看