26 条题解
-
2sysky (fyy2017) LV 8 @ 2018-11-02 11:13:10
有人说枚举会超时
可是我就是枚举做的#include<bits/stdc++.h> using namespace std; int bc[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; bool check(int x) { int tmp=x,n=0; while(tmp>=10) { n=n*10+tmp%10; tmp/=10; } n=n*10+tmp; //cout<<n<<" "<<x<<":\n"; if(n==x) return true; return false; } int main() { int a,b,cnt=0;scanf("%d%d",&a,&b); for(int i=a;i<=b;i++) { bool flag=0;//是不是闰年 int day=i%100; int mon=(i/100)%100; int year=i/10000; if(year%4==0) { if(year%100==0) { if(year%400==0) flag=1; } else flag=1; } if(flag) { if(mon==2) { if(day>29) continue; } else if(day > bc[mon]) continue; } else if(day > bc[mon]) continue; if(mon > 12) continue; if(check(i)) { //printf("%d\n",i); cnt++; } } printf("%d",cnt); return 0; }
-
12022-01-12 18:02:47@
啊确实我就是枚举做的
var
yy,mm,dd,sum,yydl,mmdl,dddl,l,i,dx,k:longint;
s1,s2,sl,yz,mz,dz:string;
zw,hw:array[1..8]of char;
ding,ohh:boolean;
begin
readln(s1);
val(s1[1..4],yy,l);val(s1[5..6],mm,l);val(s1[7..8],dd,l);
readln(s2);
val(s2[1..4],yydl,l);val(s2[5..6],mmdl,l);val(s2[7..8],dddl,l);
ding:=false;
while ding=false do
begin
str(yy,yz);
for i:=1 to 4 do zw[i]:=yz[i];
if(mm<10)then
begin
zw[5]:='0';
str(mm,sl);
zw[6]:=sl[1];
end else begin
str(mm,mz);
for i:=5 to 6 do zw[i]:=mz[i-4]
end;
if(dd<10)then
begin
zw[7]:='0';
str(dd,sl);
zw[8]:=sl[1];
end else begin
str(dd,dz);
for i:=7 to 8 do zw[i]:=dz[i-6];
end;
for i:=1 to 8 do hw[i]:=zw[9-i];
ohh:=true;k:=0;
repeat
inc(k);
if zw[k]<>hw[k]then ohh:=false;
until(ohh=false)or(k=8);
if(k=8)and(ohh=true)then inc(sum);
if(yy=yydl)and(mm=mmdl)and(dd=dddl)then ding:=true
else begin
if(mm=1)or(mm=3)or(mm=5)or(mm=8)or(mm=7)or(mm=10)or(mm=12)then dx:=31
else if(mm=4)or(mm=6)or(mm=9)or(mm=11)then dx:=30
else begin
if(yy mod 4=0)and(yy mod 100<>0)or(yy mod 400=0)then dx:=29
else dx:=28;
end;
inc(dd);
if dd>dx then
begin
dd:=1;
inc(mm);
end;
if mm>12then
begin
mm:=1;
inc(yy);
end;
end;
end;
write(sum);readln;readln;
end. -
12021-08-30 09:04:37@
#include <bits/stdc++.h> using namespace std; int main() { int date1,date2,year1,year2,fan_year,aim_date,tmp_year,month,day,cnt=0; int days[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31}; cin>>date1>>date2; year1=date1/10000; year2=date2/10000; for(int year=year1; year<=year2; year++){ tmp_year=year; fan_year=0; for(int i=1; i<=4; i++){ fan_year=tmp_year%10+fan_year*10; tmp_year/=10; } month=fan_year/100; day=fan_year%100; aim_date=year*10000+month*100+day; if(month<=12 && month>=1 && day<=days[month] && aim_date>=date1 && aim_date<=date2) cnt++; } cout<<cnt; return 0; }
-
12017-10-07 18:45:08@
这题其实不用枚举,时间消耗比较多。。(分秒必争呀)
其实先把年份枚举,再反推末四位,看符不符合。
注意2月29日的回文日期为9220年02月29日,特判一下就可以了,其他的2月只要超过28就return false
感觉数据还是水了点,其实我的代码有些漏洞呀。。等于首尾年份是应该再看看是否在那个范围里(还好数据水)
代码:#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; bool dao(int f) { int aa=f%10; f=f/10; int bb=f%10; f=f/10; int cc=f%10,dd=f/10; int ab=aa*10+bb,dc=cc*10+dd; if(ab==2&&dc==29) return true; if(ab>12||ab<1) return false; if((dc>31)||((ab==4||ab==6||ab==9||ab==11)&&dc==31)||(ab==2&&dc>=29)) return false; return true; } int main() { int a,b,c,d,e=0; cin>>a>>b; c=a/10000; d=b/10000; for(int i=c;i<=d;++i) { if(dao(i)==true) e++; } cout<<e; return 0; }
-
12017-09-17 10:52:21@
寀鸡
-
02020-04-13 15:16:36@
/* 根本不需要枚举, 注意每年中最多有一天是回文就行 */ #include <iostream> #include <algorithm> #include <string> using namespace std; bool Bigyear(int year) { if(year % 4 != 0 || (year % 100 == 0 && year % 400 != 0)) return false; return true; } bool Date(string date) { int year, month, day; year = stoi(date.substr(0, 4)); month = stoi(date.substr(4, 2)); day = stoi(date.substr(6, 2)); if(month <= 0 || month >= 13 || day <= 0 || day >= 32) return false; if(month == 4 || month == 6 || month == 9 || month == 11) { if(day == 31) return false; } else if(month == 2) { if(Bigyear(year)) { if(day >= 30) return false; } else if(day >= 29) return false; } return true; } int judge(string date1, string date2, string date) { if(stoi(date) >= stoi(date1) && stoi(date) <= stoi(date2) && Date(date)) return 1; return 0; } int Ans(string date1, string date2) { int ans = 0; string s1, s2; int k = stoi(date1.substr(0, 4)); int M = stoi(date2.substr(0, 4)); while (k <= M) { s2 = s1 = to_string(k); reverse(s2.begin(), s2.end()); s1 += s2; ans += judge(date1, date2, s1); k++; } return ans; } int main() { string date1, date2; cin >> date1 >> date2; cout << Ans(date1, date2) << endl; return 0; }
-
02018-01-23 01:29:14@
吐槽一下Vijos的C编译器居然不认识gets()&&itoa();
May the father of understanding guide U; -
02017-02-15 13:33:06@
#include <cstdio> int m[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; inline bool check(int date) { int t[9]; t[0] = 0; while (date) { t[++t[0]] = date%10; date /= 10; } for (int i = 1;i <= 4;i++) if (t[i] != t[8-i+1]) return false; return true; } inline int next(int i) { int year,month,day; day = (i%10)+((i/10%10)*10); i /= 100; month = (i%10)+((i/10%10)*10); i /= 100; year = (i%10)+((i/10%10)*10)+((i/100%10)*100)+i/1000*1000; if ((!(year%4) && year%100) || !(year%400)) m[2] = 29; day++; if (day == m[month]+1) { day = 1; month++; } if (month == 13) { month = 1; year++; } return day+month*100+year*10000; } int main() { //freopen("date.in","r",stdin); //freopen("date.out","w",stdout); int date1,date2,ans = 0; scanf("%d%d",&date1,&date2); for (int i = date1;i <= date2;i = next(i)) if (check(i)) ans++; printf("%d",ans); return 0; }
-
02017-02-15 09:15:56@
编译成功
测试数据 #0: Accepted, time = 0 ms, mem = 732 KiB, score = 10
测试数据 #1: Accepted, time = 15 ms, mem = 728 KiB, score = 10
测试数据 #2: Accepted, time = 0 ms, mem = 732 KiB, score = 10
测试数据 #3: Accepted, time = 0 ms, mem = 732 KiB, score = 10
测试数据 #4: Accepted, time = 0 ms, mem = 732 KiB, score = 10
测试数据 #5: Accepted, time = 0 ms, mem = 732 KiB, score = 10
测试数据 #6: Accepted, time = 0 ms, mem = 732 KiB, score = 10
测试数据 #7: Accepted, time = 15 ms, mem = 728 KiB, score = 10
测试数据 #8: Accepted, time = 93 ms, mem = 732 KiB, score = 10
测试数据 #9: Accepted, time = 156 ms, mem = 736 KiB, score = 10
Accepted, time = 279 ms, mem = 736 KiB, score = 100这题太缩水了。。。
-
02017-02-15 09:07:08@
大家想一想,这道题千万不能用枚举,不要相信任何枚举内容
-
02017-02-15 09:06:54@
#include <bits/stdc++.h> using namespace std; bool hw(int a) { int x[11]; for(int i=0;i<8;a/=10,i++) { x[i]=a%10; } for(int i=0,j=7;i<4;i++,j--) { if(x[i]!=x[j]) return 0; } return 1; } int main() { int i,j,k,l=0,n,m; cin>>n>>m; int x=n; for(;x<=m;) { bool run=false; if(x/10000%400==0||(x/10000%100!=0&&x/10000%4==0)) run=true; short flag; k=x/100%100; if(k==1||k==3||k==5||k==7||k==8||k==10||k==12) flag=2; else if(k==2) { if(run) flag=0; else { flag=-1; } } else flag=1; if(flag==2&&x%100==32) x+=69; else if(flag==1&&x%100==31) x+=70; else if(flag==0&&x%100==30) x+=71; else if(flag==-1&&x%100==29) x+=72; k=x/100%100; if(k==13) x=x+8800; if(hw(x)) l++; x++; } cout<<l<<endl; return 0; }
-
02017-02-15 09:06:42@
#include <bits/stdc++.h> using namespace std; bool hw(int a) { int x[11]; for(int i=0;i<8;a/=10,i++) { x[i]=a%10; } for(int i=0,j=7;i<4;i++,j--) { if(x[i]!=x[j]) return 0; } return 1; } int main() { int i,j,k,l=0,n,m; cin>>n>>m; int x=n; for(;x<=m;) { bool run=false; if(x/10000%400==0||(x/10000%100!=0&&x/10000%4==0)) run=true; short flag; k=x/100%100; if(k==1||k==3||k==5||k==7||k==8||k==10||k==12) flag=2; else if(k==2) { if(run) flag=0; else { flag=-1; } } else flag=1; if(flag==2&&x%100==32) x+=69; else if(flag==1&&x%100==31) x+=70; else if(flag==0&&x%100==30) x+=71; else if(flag==-1&&x%100==29) x+=72; k=x/100%100; if(k==13) x=x+8800; if(hw(x)) l++; x++; } cout<<l<<endl; return 0; } ```c++
-
-12017-08-25 00:24:51@
so water
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <algorithm> using namespace std; int mon[13]={-1,31,28,31,30,31,30,31,31,30,31,30,31}; int main() { int d1,d2,f=0; scanf("%d\n%d",&d1,&d2); int y1=d1/10000; int y2=d2/10000; int sum=0; for(int i=y1;i<=y2;i++) { int d=i*10000+i%10*1000+i%100/10*100+i%1000/100*10+i%10000/1000; int m=d%10000/100; int day=d%100; if(m>=1&&m<=12) { if(day>=1&&day<=mon[m]) sum++; } if(i==9220) sum++; } printf("%d",sum); return 0; }
-
-12017-07-27 23:02:05@
超长代码
const c:array[1..12] of integer=(31,29,31,30,31,30,31,31,30,31,30,31);
var n,i,s,k:longint;
a,b:array[1..3] of integer;
s1,s2:string;
procedure re;
var i,sx:integer;
begin
sx:=1000;
for i:=1 to 8 do
begin
if i<5 then begin
a[1]:=a[1]+(ord(s1[i])-48)*sx;
sx:=sx div 10;
end;
if (i<7)and(i>4) then begin
a[2]:=a[2]+(ord(s1[i])-48)*sx;
sx:=sx div 10
end;
if (i<9)and(i>6) then begin
a[3]:=a[3]+(ord(s1[i])-48)*sx;
sx:=sx div 10;
end;
if (i=4)or(i=6) then sx:=10;
end;
end;
procedure rea;
var i,sx:integer;
begin
sx:=1000;
for i:=1 to 8 do
begin
if i<5 then begin
b[1]:=b[1]+(ord(s2[i])-48)*sx;
sx:=sx div 10;
end;
if (i<7)and(i>4) then begin
b[2]:=b[2]+(ord(s2[i])-48)*sx;
sx:=sx div 10;
end;
if (i<9)and(i>6) then begin
b[3]:=b[3]+(ord(s2[i])-48)*sx;
sx:=sx div 10;
end;
if (i=4)or(i=6) then sx:=10;
end;
end;
procedure pp(x:integer);
begin
if ((x mod 4=0)and(x mod 100<>0))or(x mod 400=0) then c[2]:=29
else c[2]:=28;
end;
function check(y,z:string):boolean;
begin
if (y[1]=z[4])and(y[2]=z[3])and(y[3]=z[2])and(y[4]=z[1]) then exit(true)
else exit(false);
end;
begin
readln(s1);
readln(s2);
if s1=s2 then
begin
s2:=copy(s1,5,4);
delete(s1,5,4);
if check(s1,s2) then writeln(1)
else writeln(0);
halt;
end;
fillchar(a,sizeof(a),0);re;
fillchar(b,sizeof(b),0);rea;
s:=0;
pp(a[1]);
while (a[1]<>b[1])or(a[2]<>b[2])or(a[3]<>b[2]) do
begin
k:=a[2]*100+a[3];
s1:='';s2:='';str(a[1],s1);str(k,s2);
if a[2]<10 then insert('0',s2,1);
if check(s1,s2) then inc(s);
inc(a[3]);
if a[3]>c[a[2]] then
begin
a[3]:=1;
inc(a[2]);
end;
if a[2]>12 then
begin
a[2]:=1;
inc(a[1]);
pp(a[1]);
end;
end;
writeln(s);
end. -
-12017-07-25 13:34:28@
完全不用枚举
根据年份构造回文串判断是否合法即可
强悍的O(1)
cpp
#include<bits/stdc++.h>
using namespace std;
int mon[13]={-1,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
int d1,d2,f=0;
cin>>d1>>d2;
int y1=d1/10000;
int y2=d2/10000;
int sum=0;
for(int i=y1;i<=y2;i++)
{
int d=i*10000+i%10*1000+i%100/10*100+i%1000/100*10+i%10000/1000;
int m=d%10000/100;
int day=d%100;
//cout<<d<<" "<<i<<"/"<<m<<"/"<<day<<endl;
if(m>=1&&m<=12)
{
if(day>=1&&day<=mon[m])sum++;//cout<<d<<" "<<i<<"/"<<m<<"/"<<day<<endl;
}
if(i==9220)sum++;
}
cout<<sum<<endl;
return 0;
}
-
-12017-07-15 11:05:42@
帮我看看错哪了
var
s1,s2:string;
s,i,j,y1,y2,m,d,x,y:longint;
f:byte;
begin
readln(s1);readln(s2);
val(copy(s1,1,4),y1);val(copy(s2,1,4),y2);
for i:=y1 to y2 do begin
f:=0;
m:=i mod 10*10+i mod 100 div 10;
d:=i div 100 mod 10*10+i div 1000;
if (m>=1)and(m<=12) then f:=1;
if (f=1) then begin
if (m=1)or(m=3)or(m=5)or(m=7)or(m=8)or(m=10)or(m=12) then begin
if (d>=1)and(d<=31) then f:=2;
end
else begin
if (m<>2) then if (d>=1)and(d<=30) then f:=2
else begin
if (i mod 4=0)and(i mod 100<>0)or(i mod 400=0) then begin
if (d>=1)and(d<=29) then f:=2;
end
else if (d>=1)and(d<=28) then f:=2;
end;
end;
end;
if i=y1 then begin
val(copy(s1,5,2),x);val(copy(s1,7,2),y);
if (f=2)and(m>=x)and(d>=y)then inc(s);
end;
if (i=y2)and(i<>y1) then begin
val(copy(s2,5,2),x);val(copy(s2,7,2),y);
if (f=2)and(m<=x)and(d<=y)then inc(s);
end;
if (i>y1)and(i<y2)then if f=2 then inc(s);
end;
writeln(s);
end. -
-12017-07-15 11:04:06@
var
s1,s2:string;
s,i,j,y1,y2,m,d,x,y:longint;
f:byte;
begin
readln(s1);readln(s2);
val(copy(s1,1,4),y1);val(copy(s2,1,4),y2);
for i:=y1 to y2 do begin
f:=0;
m:=i mod 10*10+i mod 100 div 10;
d:=i div 100 mod 10*10+i div 1000;
if (m>=1)and(m<=12) then f:=1;
if (f=1) then begin
if (m=1)or(m=3)or(m=5)or(m=7)or(m=8)or(m=10)or(m=12) then begin
if (d>=1)and(d<=31) then f:=2;
end
else begin
if (m<>2) then if (d>=1)and(d<=30) then f:=2
else begin
if (i mod 4=0)and(i mod 100<>0)or(i mod 400=0) then begin
if (d>=1)and(d<=29) then f:=2;
end
else if (d>=1)and(d<=28) then f:=2;
end;
end;
end;
if i=y1 then begin
val(copy(s1,5,2),x);val(copy(s1,7,2),y);
if (f=2)and(m>=x)and(d>=y)then inc(s);
end;
if (i=y2)and(i<>y1) then begin
val(copy(s2,5,2),x);val(copy(s2,7,2),y);
if (f=2)and(m<=x)and(d<=y)then inc(s);
end;
if (i>y1)and(i<y2)then if f=2 then inc(s);
end;
writeln(s);
end. -
-12017-03-22 14:26:15@
主要考判断语句,从开始年份到目标年份枚举,每年月份枚举,注意月份的天数有的31有的30,还要判断是不是为闰年or平年,如此便穷举出所有有效日期,随后判断计数输出即可。
```pascal
var
d1,d2,sy,ey,i,j,k,s,ans:longint;function pan(s:longint):boolean;
var
i:longint;
st:string;
begin
str(s,st);
for i:= 1 to 4 do
begin
if st[i]<>st[8-i+1] then exit(false);
end;
exit(true);
end;
begin
readln(d1,d2);
sy:=d1 div 10000;
ey:=d2 div 10000;
for i:= sy to ey do
begin
for j:= 1 to 12 do
begin
if (j=1) or (j=3) or(j=5) or (j=7) or (j=8) or (j=10) or (j=12) then
begin
for k:= 1 to 31 do
begin
s:=i*10000+j*100+k;
if (s>=d1) and (s<=d2) then
if pan(s) then inc(ans);
end;
end
else if (j=2) then
begin
if ( (i mod 4 =0) and (i mod 100 <>0 )) or (i mod 400=0) then
begin
for k:= 1 to 29 do
begin
s:=i*10000+j*100+k;
if (s>=d1) and (s<=d2) then
if pan(s) then inc(ans);
end;
end
else
begin
for k:= 1 to 28 do
begin
s:=i*10000+j*100+k;
if (s>=d1) and (s<=d2) then
if pan(s) then inc(ans);
end;
end;
end
else
begin
for k:= 1 to 30 do
begin
s:=i*10000+j*100+k;
if (s>=d1) and (s<=d2) then
if pan(s) then inc(ans);
end;
end;
end;
end;
writeln(ans);
end.
``` -
-12017-02-18 20:27:49@
#include <iostream>
#include<algorithm>
using namespace std;
int Sovle(int a[],int x,int n,int R)
{
int i=x,j;
while(a[i]-R<a[x]&&i<n)
{
i++;
}
if(i==n&&a[i]-R<a[x])
return 1;
i--;
for(j=i;j<n;j++)
if(a[j]>a[i]+R)
break;
return 1+Sovle(a,j,n,R);
}
int main ()
{
int R,x[10000],N;
cin>>R>>N;
for(int i=0;i<N;i++)
cin>>x[i];
sort(x,x+N);
cout<<Sovle(x,0,N,R);
return 0;
} -
-12017-02-18 17:30:13@
#include <iostream>
#include <string>
using namespace std;
int get(string s,bool x)
{
if(x==true)
return (s[0]-48)*1000+(s[1]-48)*100+(s[2]-48)*10+(s[3]-48);
else
return (s[7]-48)*1000+(s[6]-48)*100+(s[5]-48)*10+(s[4]-48);
}
void change(int x,int a[])
{
int i,xx=x;
for(i=0;i<4;i++)
a[i]=xx%10,xx/=10;
}
bool judge(int a[],int year)
{
int month=a[0]*10+a[1],day=a[2]*10+a[3];
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
if(day<=31)
{
return true;
}
}
if(month==4||month==6||month==9||month==11)
{
if(day<=30)
{
return true;
}
}
if(month==2)
{
if(year%4==0&&year%100!=0||year%400==0)
{
if(day<=29)
{
return true;
}
}
else
{
if(day<=28)
{
return true;
}
}
}
return false;
}
int main ()
{
string start,end;
cin>>start>>end;
int s=get(start,true),e=get(end,true),a[4],sum=0;
if(get(start,true)<get(start,false))
s++;
if(get(end,true)<get(end,false))
e--;
while(s<=e)
{
change(s,a);
if(judge(a,s)==true)
sum++;
s++;
}
cout<<sum;
return 0;
}
信息
- ID
- 2010
- 难度
- 4
- 分类
- (无)
- 标签
- 递交数
- 1321
- 已通过
- 328
- 通过率
- 25%
- 被复制
- 22
- 上传者