程式設計之美2015第一題

2021-07-01 23:06:11 字數 2451 閱讀 4201

給定兩個日期,計算這兩個日期之間有多少個2月29日(包括起始日期)。

只有閏年有2月29日,滿足以下乙個條件的年份為閏年:

1. 年份能被4整除但不能被100整除

2. 年份能被400整除

第一行為乙個整數t,表示資料組數。

之後每組資料報含兩行。每一行格式為"month day, year",表示乙個日期。month為中的乙個字串。day與year為兩個數字。

資料保證給定的日期合法且第乙個日期早於或等於第二個日期。

對於每組資料輸出一行,形如"case #x: y"。x為資料組數,從1開始,y為答案。

1 ≤ t ≤ 550

小資料:

2000 ≤ year ≤ 3000

大資料:

2000 ≤ year ≤ 2×109

這道題由於資料量是1e9

所以用迴圈必死。

這裡我們用到了容斥的原理,之餘容斥是什麼,自己去腦補,我也是學長給我講了以後才知道的

由於我們需要(能被400整除和能被4但是不能被100整除的數),所以我們:能被4整除的數的個數+能被4整除的

-能被100整除的數的個數,這我們就算出了在年分a以前的閏年個數。

這裡由於我們只關心年分,所以我在之前把年分處理了一下

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#define nn 110

#define inff 0x3fffffff

#define nn 20000007

#define maxx 2e9

#define ll long long

using namespace std;

char cc[20][10]=;

int main()

}for(i=0;i<12;i++)

}if(month1>=3)

if(month2==2)

}else if(month2<2)

a4=year1/4;

a400=year1/400;

a100=year1/100;

b4=year2/4;

b400=year2/400;

b100=year2/100;

ll g1=0,g2=0;

ll flag1=0,flag2=0;

if(year2%400==0||(year2%4==0&&year2%100!=0))

flag2=1;

if(year1%400==0||(year1%4==0&&year1%100!=0))

flag1=1;

if(year1==year2)

else

else  if(flag1==1&&flag2==0)

else  if(flag1==1&&flag2==1)

else  if(flag1==0&&flag2==0)

}//printf("***  %lld %lld *****\n",year1,year2);

ll pp=0;

for(i=year1;i<=year2;i++)

//  cntmon=cnt[0]+cnt[1]-cnt[2];

//     printf("&&&&&&&&  %lld\n",pp);

printf("case #%lld: %lld\n",i1,cntmon);}}

}

微軟程式設計之美2015 第一題

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 給定兩個日期,計算這兩個日期之間有多少個2月29 日 包括起始日期 只有閏年有2月29 1.年份能被 4整除但不能被 100整除 2.年份能被 400整除 第一行為乙個整數t 表示資料組數。之後每組資料報含兩行。每一行格式為 m...

程式設計之美2015初賽A

時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 兩個數a和 b a第一行為乙個數t,為資料組數。之後每組資料報含兩行。第一行為n,為集合s的大小。第二行為n個整數,表示集合內的數。對於每組資料輸出一行,形如 case x y x為資料編號,從1開始,y為最大的子集的大小。1 ...

程式設計之美題選

1 求二進位制數中1的個數 1 除以2 根據餘數 判斷,迭代 2 與1相與,根據結果判斷,迴圈移位 3 列出全部資料對映2 1 3 2 4 1 建立hash表o 1 4 1100 1011 1000 能去掉最右邊的1 intnumber int n 2 求出陣列中個數超過一半的數字a 每次刪除2個不...