https://pintia.cn/problem-sets/994805260223102976/problems/994805293282607104
测试点3出错了,原因是还要考虑所有生日都不符合条件的情况。
方法一:这个方法不太好,虽然计算了闰年平年,但是只算时间跨度的话,其实可以忽略。
#include<iostream>
using namespace std;
long int span(int start, int y, int m, int d){
int month=1, arr[12]={31,28,31,30,31,30,31,31,30,31,30,31};
long int days=0;
for(; start<y; start++)
days += ((start%4==0 && start%100!=0) || start%400==0) ? 366 : 365;
if((start%4==0 && start%100!=0) || start%400==0)
arr[1]=29;
while(month<m)
days += arr[month++ -1];
days += d;
return days;
}
int main(){
long int days, max=0, min=100000000;
int n, y, m, d, num=0, max_index=-1, min_index=-1;
cin >> n;
string str[n];
for(int i=0; i<n; i++){
cin >> str[i];
scanf("%d/%d/%d", &y, &m, &d);
if((y>1814 && y<2014) || (y==1814 && m>9) || (y==1814 && m==9 && d >=6) ||
(y==2014 && m<9) || (y==2014 && m==9 && d<=6)){
num ++;
days = span(y, 2014, 9, 6) - span(y, y, m, d);
if(days > max){
max = days;
max_index = i;
}
if(days < min){
min = days;
min_index = i;
}
}
}
if(min_index!=-1 && max_index!=-1)
printf("%d %s %s\n", num, str[max_index].c_str(), str[min_index].c_str());
else
printf("0\n");
}
方法二:更简单的版本,不用算闰年平年,每个月直接算30天。
#include<iostream>
using namespace std;
int main(){
int sta=1814*360+8*30+6, end=2014*360+8*30+6;
int n, y, m, d, mid, day, count=0;
int max=0, min=100000, max_index=-1, min_index=-1;
cin >> n;
string str[n];
for(int i=0; i<n; i++){
cin >> str[i];
scanf("%d/%d/%d", &y, &m, &d);
mid = y*360+(m-1)*30+d;
if(sta <= mid && mid <= end){
count ++;
day = end-mid;
if(day > max){
max=day;
max_index=i;
}
if(day < min){
min=day;
min_index=i;
}
}
}
if(count>0)
cout << count << " " << str[max_index] << " " << str[min_index];
else
cout << 0;
}