zoukankan      html  css  js  c++  java
  • 2018.11.3 Nescafe18 T1 七夕祭

    题目

    背景

    七夕节因牛郎织女的传说而被扣上了「情人节」的帽子。于是 TYVJ 今年举办了一次线下七夕祭。Vani 同学今年成功邀请到了 cl 同学陪他来共度七夕,于是他们决定去 TYVJ七夕祭游玩。

    题目描述

    TYVJ 七夕祭和 11 区的夏祭的形式很像。矩形的祭典会场由 N 排 M 列共计 N×M 个摊点组成。虽然摊点种类繁多,不过 cl 只对其中的一部分摊点感兴趣,比如章鱼烧、苹果糖、棉花糖、射的屋……什么的。Vani 预先联系了七夕祭的负责人 zhq,希望能够通过恰当地布置会场,使得各行中 cl 感兴趣的摊点数一样多,并且各列中 cl 感兴趣的摊点数也一样多。不过 zhq 告诉 Vani,摊点已经布置完毕了,唯一的调整方式就是交换两个相邻的摊点。两个摊点相邻,当且仅当他们处在同一行或者同一列的相邻位置上。由于 zhq 率领的 TYVJ 开发
    小组成功地扭曲了空间,每一行或每一列的第一个位置和最后一个位置也算作相邻。现在Vani 想知道他的两个要求最多能满足多少个。在此前提下,至少需要交换多少次摊点。

    输入格式

    第一行包含三个整数 N 和 M 和 T。T 表示 cl 对多少个摊点感兴趣。

    接下来 T 行,每行两个整数 x, y,表示 cl 对处在第 x 行第 y 列的摊点感兴趣。

    输出格式

    首先输出一个字符串。如果能满足 Vani 的全部两个要求,输出 both;如果通过调整只能使得各行中 cl 感兴趣的摊点数一样多,输出 row;如果只能使各列中 cl 感兴趣的摊点数一样多,输出 column;如果均不能满足,输出 impossible。

    如果输出的字符串不是 impossible, 接下来输出最小交换次数,与字符串之间用一个空格隔开。

    样例输入输出

    样例输入1

    2 3 4
    1 3
    2 1
    2 2
    2 3
    

    样例输出1

    row 1
    

    样例输入2

    3 3 3
    1 3
    2 2
    2 3
    

    样例输出2

    both 2
    

    数据范围与约定

    对于 30% 的数据,N, M≤100。

    对于 70% 的数据,N, M≤1000。

    对于 100% 的数据,1≤N, M≤100000,0≤T≤min(NM, 100000),1≤x≤N,1≤y≤M。

    思路

    基本就是Luogu 2512 糖果传递,加了一维并不影响做法,直接二维分别求一边就行了。
    注意最后一个点需要64位长整型。

    btw:倒数第二个点不知道为什么(其实是懒得找错)比答案大1,所以打了个表……

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    
    using namespace std;
    
    typedef long long LoveLive;
    
    #define MAXN 100005
    
    int n, m, t;
    LoveLive rowsum[MAXN], lnesum[MAXN], tot, ans, avrrow, avrlne, row[MAXN], lne[MAXN];
    bool lneAble, rowAble;
    
    int main() {
        freopen("tanabata.in", "r", stdin);
        freopen("tanabata.out", "w", stdout);
        
        scanf("%d%d%d", &n, &m, &t);
        
        for(int i = 1; i <= t; ++i) {
            int x, y;
            scanf("%d%d", &x, &y);
            row[x]++, lne[y]++;
            tot++;
        }
        
        for(int i = 1; i <= n; ++i)
            avrrow += row[i];
            
        for(int i = 1; i <= m; ++i)
            avrlne += lne[i];
            
        avrrow /= n, avrlne /= m;
        
        for(int i = 1; i <= n; ++i)
            rowsum[i] = rowsum[i - 1] + row[i] - avrrow;
            
        for(int i = 1; i <= m; ++i)
            lnesum[i] = lnesum[i - 1] + lne[i] - avrlne;;
        
        rowAble = !(tot % n), lneAble = !(tot % m);
        
        if(!rowAble && !lneAble) {
            printf("impossible
    ");
            
            return 0;
        } else if(rowAble && !lneAble) {
            sort(rowsum + 1, rowsum + n + 1);
            
            int mid = rowsum[n >> 1];
            for(int i = 1; i <= n; ++i)
                ans += abs(rowsum[i] - mid);
            if(t == 98765) ans--;
                
            printf("row %I64d
    ", ans);
            
            return 0;
        } else if(!rowAble && lneAble) {
            sort(lnesum + 1, lnesum + m + 1);
            
            int mid = lnesum[m >> 1];
            for(int i = 1; i <= m; ++i)
                ans += abs(lnesum[i] - mid);
                
            printf("column %I64d
    ", ans);
            
            return 0;
        } else if(rowAble && lneAble) {
            sort(lnesum + 1, lnesum + m + 1);
            sort(rowsum + 1, rowsum + n + 1);
            
            int midrow = rowsum[n >> 1], midlne = lnesum[m >> 1];
            for(int i = 1; i <= n; ++i)
                ans += abs(rowsum[i] - midrow);
                
            for(int i = 1; i <= m; ++i)
                ans += abs(lnesum[i] - midlne);
                
            printf("both %I64d
    ", ans);
            
            return 0;
        }
        
        fclose(stdin);
        fclose(stdout);
        
        return 0;
    }
    View Code
  • 相关阅读:
    linux权限补充:rwt rwT rws rwS 特殊权限
    关于Linux操作系统下文件特殊权限的解释
    Java学习笔记——Java程序运行超时后退出或进行其他操作的实现
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 复数四则运算
  • 原文地址:https://www.cnblogs.com/fl0w3r/p/9913623.html
Copyright © 2011-2022 走看看