DAY6 - T1
T1:
题目
题目描述
张北蚤的部队有 n 个跳蚤,散步在平坦宇宙母舰上,母舰为无线平面。每一
个跳蚤的坐标为(x[i],y[i]).(保证 x[i],y[i]为正奇数) 没有两个跳蚤在同一位置。 张北蚤想要划两条直线,x=a,y=b.(a,b 为正偶数) 两条线交于(a,b),将部队分为四个部分。
设 M 为跳蚤最多的一部分,求 M 的最小值。
输入
输入文件为 a.in。 第一行包含一个整数 n
接下来 n 行每行两个数 x[i],y[i]
输出
输出文件为 a.out。 一个整数。
样例
输入
7 
7 3 
5 5 
7 13
3 1 
11 7
5 3
9 1
输出
2
数据
对于前 30%的数据,n<=10
对于另外 60%的数据,满足 0<n,[i],y[i]<=100 
对于 100%的数据,满足 n<=1000,0<x[i],y[i]<=1e6
题解
二维前缀和 + DFS
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
using namespace std;
const int L = 1010;
struct node{
	int s, num;
}zx[L],zy[L];
bool cmp(node &b, node &c){
	return b.s < c.s;
}
int n, x[L], y[L], ans = 2147483647, sum[L][L];
int main(){
	scanf("%d", &n);
	for(int i = 1; i <= n; i++){
		scanf("%d%d", &zx[i].s, &zy[i].s);
		zx[i].num = i;
		zy[i].num = i;
	}
	sort(zx+1, zx+n+1, cmp);
	sort(zy+1, zy+n+1, cmp);
	for(int i = 1; i <= n; i++){
		x[zx[i].num] = i;
		y[zy[i].num] = i;
	}
	for(int i = 1; i <= n; i++){
		sum[x[i]][y[i]]++;
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			sum[i][j] += sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1];
		}
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			ans = min(ans, max(max(sum[i][j], sum[i][n]-sum[i][j]), max(sum[n][j]-sum[i][j], sum[n][n]-sum[n][j]-sum[i][n]+sum[i][j])));
		}
	}
	printf("%d\n", ans);
	return 0;
}
    没有未来的未来不是我想要的未来
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号