比赛 noip 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 __围栏问题 最终得分 100
用户昵称 Lethur 运行时间 0.077 s
代码语言 C++ 内存使用 0.32 MiB
提交时间 2016-11-04 21:10:55
显示代码纯文本
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <ctime>
    #include <stdio.h> 
    #include <algorithm>
     
     
    using namespace std;
    typedef long long lg;
     
    #define MAXX 500009
    #define MOD 100000007
     
    int n,m,k;
    lg ans = 10000000;
    int t[20][20];
    int maax = 0,may = 0,mix=1000000,miy=10000000;
    struct data {
    	int x,y;
    }a[20];
     
    double start;
     
    inline int js(bool ok) {
    	lg tmp = 0;
    	for(int i = 1; i <= k; i++) {
         maax = 0;may = 0;mix=10000000;miy=10000000;
         if(t[i][0] == 0)  break;
    	 for(int j = 1; j<= t[i][0]; j++) {
    	 	int tt = t[i][j];
    	 	mix = min(mix,a[tt].x);
    	    miy = min(miy,a[tt].y);
    	    maax = max(maax,a[tt].x);
    	    may = max(may,a[tt].y);
    	 }
    	 tmp += ((maax-mix+1)+(may-miy+1))*2;
        }
    	if(ok)ans = min(ans,tmp);
    //	double end=GetTickCount();
    //cout<<end<<endl;
      //if(ans == 2258)cout<<end-start;
      //cout<<"ghgf";
    //	if(end - start >= 2995){
    //		printf("%d",ans);
    	//	exit(0);
    //	}
    	return tmp;
        //printf("The difference is: %f seconds\n",difftime(second,first)); 
    }
     
    bool cmp(const data a,const data b) {
    	return a.x == b.x ? a.y<b.y:a.x<b.x;
    }
     
    inline void dfs(int x) {
    	if(x == n+1) {
    		js(1);
    		return;
    	}
    	for(int i = 1;i <= k;i++) {
    		if(t[i-1][0] == 0 && i != 1) break;
    		t[i][++t[i][0]] = x;
    		if(js(0) < ans)dfs(x+1);
    		t[i][0]--;
    	}
    }
     
    void work() {
    	scanf("%d%d%d",&m,&k,&n);
    	for (int i = 1; i <= n; i++) {
    	 scanf("%d%d",&a[i].x,&a[i].y);
    	  mix = min(mix,a[i].x);
    	  miy = min(miy,a[i].y);
    	  maax = max(maax,a[i].x);
    	  may = max(may,a[i].y);
        }
        sort(a+1,a+n+1,cmp);
    	if(k == 1) {
    		cout<<((maax-mix+1)+(may-miy+1))*2;
    		return;
    	}
    	if(n == 1) {
    		cout<<"4";
    		return;
    	}
    	dfs(1);
    	printf("%d",ans);
    }
     
    int main() {
        //start = GetTickCount();  
    	freopen("xfence.in","r",stdin);
    	freopen("xfence.out","w",stdout);
    	work();
    	return 0;
    }