Ambiguous Dates Gym-101522A

本文介绍了一种通过重新排列月份来减少日期表示歧义的方法。针对两种日期格式day/month/year和month/day/year,通过调整各月份天数顺序,尽可能降低可能产生歧义的日期数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Ambiguous Dates Gym-101522A


题目链接

题意:
日期有两种表示day/month/year 或 month/day/year。
7/8/2017(8/7/2017)是引起歧义的, 而15/8/2017和10/10/2017则不会。

假设一年可以有M月(1 <= M <= 10^5),每月有D天(1 <= D <= 10^5)。
假设没有闰年的情况。
要求重新排列月份,使得引起歧义的日期最少。

做法:
某个月份的天数越多,这个月就应该越靠后。排序后,计算引起歧义的日期数量即可。
例如:
2
20 1
1月在前(20 1):引起歧义的日期,1/2, 2/1。
1月靠后(1 20):没有引起歧义的日期。

计算引起歧义的日期数量的方法,如图:
我们只要统计矩阵对角线右上角,蓝线前面标注为红色的部分,最后乘以2。 因为我们是按月份的天数多少,从小到大排列的,如果存在3/8,那么一定存在8/3 。(考虑下图12个月的情况,其他类似)
这里写图片描述

这里写图片描述

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int
main() {
    int m, i, D[100005];
    long long sum;

    while( scanf("%d", &m) != EOF ) {
        memset(D, 0, sizeof(D));
        for( i = 1; i <= m; i++ ) {
            scanf("%d", &D[i]);
        }
        sort(D + 1, D + m + 1);
        sum = 0;
        for( i = 1; i <= m - 1; i++ ) {
            if( D[i] > i ) {
                if( D[i] < m ) {
                    sum += (D[i] - i);
                }
                else {
                    sum += (m - i);
                }
            }
        }
        printf("%lld\n", sum * 2);
    }

    return 0;
}

为什么for()中i <= m - 1? 而不是i <= m
有图有真相,看图就知道,其实答案是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值