• 小HY的四元组


    小HY的四元组

    可爱的小HY在偶然间发现了一种等差四元组,我们定义四元祖为{(a,b,c,d)}四个数的有序集合。若对于(i,j(i<j))的四元组{(a_i,b_i,c_i,d_i)}和{(a_j,b_j,c_j,d_j)}存在(a_i-a_j=b_i-b_j=c_i-c_j=d_i-d_j)则称((i,j))为一对等差四元组。
    小HY是个有特殊癖好的人,现在给出(n)个四元组,他想知道在所有等差四元组((i,j))(j-i)的最小值和(i+j)的最大值。聪明的你能告诉他答案吗?

    Input

    输入文件有(n+1)行,第一行为一个数(n),接下来输入(n)行,每行(a,b,c,d)四个整数。

    Output

    输出只有一行,包括(j-i)最小值(i+j)最大值,中间有空格隔开,数据保证有解

    Example

    输入 #1

    (7)
    (1) (2) (3) (4)
    (2) (3) (4) (5)
    (1) (4) (3) (3)
    (5) (2) (3) (5)
    (2) (4) (5) (6)
    (1) (4) (3) (3)
    (2) (5) (4) (4)

    输出 #1

    (1) (13)

    输入 #2

    (10)
    (1) (4) (3) (2)
    (4) (4) (4) (4)
    (2) (3) (4) (5)
    (1) (1) (1) (1)
    (1) (2) (3) (1)
    (3) (4) (2) (1)
    (2) (4) (5) (2)
    (8) (9) (7) (6)
    (0) (0) (0) (0)
    (1) (2) (3) (4)

    输出 #2

    (2) (14)

    Scoring

    对于30%的数据(n<=1000)
    对于100%的数据(n<=500000)(a,b,c,d)均在int范围内。

    不是难题,但是依旧20分

    这道题比赛时候脑子抽了...

    先是预处理的时候一定要把最小值求出来,然后用四个数去减

    然后不排序,搞了个map(憨

    用了大概是哈希一样的办法,就是每个数减去min之后乘上一个什么什么质数再加起来放到map里

    结果不仅WA还TLE

    正解边看代码边理解吧

    //感觉不用多讲,自己理解理解(真的有人看吗 
    #include<bits/stdc++.h>
    using namespace std;
    #define inf 500005
    
    int n, minn = inf, maxn;
    int a, b, c, d;
    
    struct code {
    	int x, y, z;
    	int num;
    } p[inf];
    
    bool cmp(code x, code y) {
    	if (x.x != y.x) return x.x < y.x;
    	if (x.y != y.y) return x.y < y.y;
    	if (x.z != y.z) return x.z < y.z;
    	return x.num < y.num;
    }
    
    int main() {
    	scanf("%d", &n);
    	for (int i = 1; i <= n; i++)
    	{
    		scanf("%d %d %d %d", &a, &b, &c, &d);
    		p[i].x = b - a;
    		p[i].y = c - a;
    		p[i].z = d - a;//如果两个四元组中这三个值都一样,这俩就是等差四元组 
    		p[i].num = i; 
    	}
    	sort(p + 1, p + n + 1, cmp);
    	a = p[1].x, b = p[1].y, c = p[1].z;
    	for (int i = 2; i <= n; i++) {
    		if(p[i].x != a || p[i].y != b || p[i].z != c)
    			a = p[i].x, b = p[i].y, c = p[i].z;
    		else minn = min(minn, p[i].num - p[i - 1].num), maxn = max(maxn, p[i].num + p[i-1].num);
    		//因为j-i的最小值需要尽量靠近的,i+j的最大值需要尽量靠后的,所以答案的i与j一定在排序后相邻 
    	}
    	printf("%d %d", minn, maxn);
    	return 0;
    }
    //:/
    

  • 相关阅读:
    python 进度条
    linux中利用Shell脚本实现自动安装部署weblogic服务
    Linux虚拟机如何上网
    常用Python脚本
    Allure测试框架
    软件评测师 第二小时
    保险项目测试流程(一)
    电子商务网站测试总结
    Python随机生成电话号码&号码段分析
    Python中的*args和**kwargs
  • 原文地址:https://www.cnblogs.com/Sheffield/p/13355749.html
Copyright © 2020-2023  润新知