NOIP2016普及組第二題 回文日期

2022-09-18 01:36:31 字數 3979 閱讀 2763

題目描述

牛牛習慣用8位數字表示乙個日期,其中,前4位代表年份,接下來2位代表月 份,最後2位代表日期。顯然:乙個日期只有一種表示方法,而兩個不同的日期的表 示方法不會相同。

牛牛認為,乙個日期是回文的,當且僅當表示這個日期的8位數字是回文的。現 在,牛牛想知道:在他指定的兩個日期之間包含這兩個日期本身),有多少個真實存 在的日期是回文的。

乙個8位數字是回文的,當且僅當對於所有的i ( 1 <=i<= 8 )從左向右數的第i個 數字和第9-i個數字(即從右向左數的第i個數字)是相同的。

例如:•對於2023年11月19日,用8位數字20161119表示,它不是回文的。

•對於2023年1月2日,用8位數字20100102表示,它是回文的。

•對於2023年10月2日,用8位數字20101002表示,它不是回文的。

每一年中都有12個月份:

其中,1、3、5、7、8、10、12月每個月有31天;4、6、9、11月每個月有30天;而對於2月,閏年時有29天,平年時有28天。

乙個年份是閏年當且僅當它滿足下列兩種情況其中的一種:

1.這個年份是4的整數倍,但不是100的整數倍;

2.這個年份是400的整數倍。

例如:•以下幾個年份都是閏年:2000、2012、2016。

•以下幾個年份是平年:1900、2011、2014。

輸入輸出格式

輸入格式:

輸入包括兩行,每行包括乙個8位數字。

第一行表示牛牛指定的起始日期。

第二行表示牛牛指定的終止日期。

保證date_i和都是真實存在的日期,且年份部分一定為4位數字,且首位數字不為0。

保證date1 —定不晚於date2。

輸出格式:

輸出一行,包含乙個整數,表示在date1和date2之間,有多少個日期是回文的。

輸入輸出樣例

輸入樣例#1:

20110101

20111231

輸出樣例#1:

1 輸入樣例#2:

20000101

20101231

輸出樣例#2:

2 說明

【樣例說明】

對於樣例1,符合條件的日期是20111102。

對於樣例2,符合條件的日期是20011002和20100102。

【子任務】

對於60%的資料,滿足date1 = date2。

這題我是用暴力直接搜,所以只對了六個點,拿了60分,還有四個點超時。

此題我的思路是直接乙個 for 過去,再判斷是否符合回文素數的要求。

**如下:

var x,y,j,i,o,ans:longint;

s:string;

function

pd:boolean;

var year,day,month:longint;

x:string;

begin

pd:=true;

x:=copy(s,1,4);val(x,year);

x:=copy(s,5,2);val(x,month);

x:=copy(s,7,2);val(x,day);

case month of

1,3,5,7,8,10,12:if (day>31)or(day<0) then

begin pd:=false; exit; end;

4,6,9,11:if (day>30)or(day<0) then

begin pd:=false; exit; end;

2:if (year mod

400=0)or(year mod

4=0)and(year mod

100<>0) then

if day>29

then

begin pd:=false; exit; end

else

if day>28

then

begin pd:=false; exit; end;

end;

end;

begin

assign(input,'date.in');

assign(output,'date.out');

reset(input);

rewrite(output);

read(x);

read(y);

for i:=x to y do

begin

str(i,s);

if (copy(s,5,2)>'12')or(copy(s,5,1)='0')and(copy(s,6,1)='0')or(copy(s,7,2)>'31')or(copy(s,7,1)='0')and(copy(s,8,1)='0')or(copy(s,1,1)='0') then

continue;

o:=0;

for j:=1

to length(s)div2do

if s[j]<>s[length(s)-j+1] then

begin o:=1; break; end;

if o=0

then

if pd=true

then inc(ans);

end;

write(ans);

close(input);

close(output);

end.

列舉年分,年份中再列舉月份,再列舉日期,就可以避免沒必要的迴圈。

**如下:

const

a:array[1..12]of longint=(31,28,31,30,31,30,31,31,30,31,30,31);

var s1,s2,s,m,d,i,j,k,ys,ye,ms,me,ds,de:longint;

begin

readln(s1);

readln(s2);

ys:=s1 div

10000;

ye:=s2 div

10000;

ms:=(s1 mod

10000)div

100;

me:=(s2 mod

10000)div

100;

ds:=s1 mod

100;

de:=s2 mod

100;

for i:=ys to ye do

begin

a[2]:=28;

if (i mod

4=0)and(i mod

100<>0)or(i mod

100=0)and(i mod

400=0) then

a[2]:=29;

for j:=1

to12

doif (i=ys)and(j>=ms)or(i=ye)and(j<=me)or(1=1) then

begin

if j<10

then m:=j*10

else m:=(j mod

10*10)+(j div

10);

for k:=1

to a[j] do

if (i=ys)and(j=ms)and(k>=ds)or(i=ye)and(j=me)and(k<=de)or(1=1) then

begin

if k<10

then d:=k*10

else d:=(k mod

10*10)+(k div

10);

if i=d*100+m then

begin inc(s);break; end;

end;

if i=d*100+m then

break;

end;

end;

writeln(s);

close(input);

close(output);

end.

NOIP2016普及組第二題 回文日期

題目描述 牛牛習慣用8位數字表示乙個日期,其中,前4位代表年份,接下來2位代表月 份,最後2位代表日期。顯然 乙個日期只有一種表示方法,而兩個不同的日期的表 示方法不會相同。牛牛認為,乙個日期是回文的,當且僅當表示這個日期的8位數字是回文的。現 在,牛牛想知道 在他指定的兩個日期之間包含這兩個日期本...

NOIP 2016 普及組 海港

題目鏈結 小k是乙個海港的海關工作人員,每天都有許多船隻到達海港,船上通常有很多來自不同國家的乘客。小k對這些到達海港的船隻非常感興趣,他按照時間記錄下了到達海港的每一艘船隻情況 對於第i艘到達的船,他記錄了這艘船到達的時間ti 單位 秒 船上的乘客數ki,以及每名乘客的國籍 xi,1,xi,2,x...

noip2016普及組複賽總結

9點半從紀中出發,大概11點多來到廣州六中。在六中旁邊一家小餐館吃了中餐,那餐廳真心很貴,一盆飯就要20元,我們那桌吃了四 盆.xc 不想買單啦 啦啦啦 然後就來到六中的某個功能室百無聊賴的休息了一會兒,兩點鐘進考場。兩點半 比賽開始,還是先看題.一二兩題太水了,直接開碼,1小時搞定兩題 三點半 仔...