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
有图有真相,看图就知道,其实答案是一样的。