ZOJ_3950_How Many Nines 解题报告及如何对程序进行测试修改
The 17th Zhejiang University Programming Contest Sponsored by TuSimple
Solution:
#include <stdio.h>
#include <stdlib.h> int main()
{
long month[]={,,,,,,,,,,,,};
long month_leap[]={,,,,,,,,,,,,};
long tmonth[],tmonth_leap[];
long t,i,j,k,l,s,g,y1,m1,d1,y2,m2,d2,run1,run2,ans=;
long ge[]={},line[];
tmonth[]=;
tmonth_leap[]=;
for (i=;i<;i++)
{
tmonth[i]=tmonth[i-]+month[i];
tmonth_leap[i]=tmonth_leap[i-]+month_leap[i];
}
//between 2000-01-01 and 9999-12-31
//the number of "9" in a year(do in advance)
for (i=;i<=;i++)
for (j=;j<=;j++)
for (k=;k<=;k++)
for (l=;l<=;l++)
{
s=i*+j*+k*+l;
//the number of 9 in "ijkl"
g=((i==)+(j==)+(k==)+(l==));
//year(days in a year)
//+month(3*12,except February)
//+day(September)
if (s%== && (s%!= || s%==))
ge[s]=*g++;
else
ge[s]=*g++;
}
//line[i]:the number of "9" in year 2000~i
line[]=;
for (i=;i<=;i++)
line[i]=line[i-]+ge[i];
scanf("%ld",&t);
for (l=;l<=t;l++)
{
scanf("%ld%ld%ld%ld%ld%ld",&y1,&m1,&d1,&y2,&m2,&d2);
//year [y1,y2) "[":included "(":not included
ans=line[y2-]-line[y1-]; //1 delete y1.1.1~y1.m1.(d1-1)
g=(y1%==)+(y1/%==)+(y1/%==)+(y1/%==);
//judge if loop year or not
if (y1%== && (y1%!= || y1%==))
run1=;
else
run1=;
//year(days in year y1)
if (run1==)
ans-=g*tmonth_leap[m1-];
else
ans-=g*tmonth[m1-];
ans-=(d1-)*g; //month
ans-=(m1-)*;
if (d1>=)
ans-=;
else if (d1>=)
ans-=;
else if (d1>=)
ans-=;
//February
if (run1== && m1>)
ans++;
//month
if (m1>)
ans-=;
else if (m1==)
ans-=(d1-); //2 add y2.1.1~y2.m2.d2
g=(y2%==)+(y2/%==)+(y2/%==)+(y2/%==);
if (y2%== && (y2%!= || y2%==))
run2=;
else
run2=;
if (run2==)
ans+=g*tmonth_leap[m2-];
else
ans+=g*tmonth[m2-];
ans+=d2*g; ans+=(m2-)*;
if (d2>=)
ans+=;
else if (d2>=)
ans+=;
else if (d2>=)
ans+=;
if (run2== && m2>)
ans--; if (m2>)
ans+=;
else if (m2==)
ans+=d2; printf("%ld\n",ans);
}
return ;
}
感想:
正确题数机制:
1.认真看题,不要漏掉一些特殊情况。
2.多设数据,查看自己的程序是否完善。
3.对于渣渣,还是从简单题做起,不要对繁琐的模拟题丧失耐心,因为这是你得分的关键。
尤其是这道模拟题,细心加耐心
当你做出这道题提交上去时WrongAnswer,然后看了几遍自己程序,修改了一下,然后提交上去,还是WrongAnswer时,你的内心是崩溃的!
错误一般是:
1.漏掉一些特殊点
2.变量,下标写错
这时你可以这样做:
1.在网上找一份对的程序(亲自提交一下)
2.对自己的程序和标程创建文件流
(网上别人的程序)
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <cstdio>
#include <set>
#include <math.h>
#include <algorithm>
#include <queue>
#include <iomanip>
#include <map>
#define INF 0x3f3f3f3f
#define MAXN 1005
#define Mod 99999999
using namespace std;
int num[];
int count9(int n)
{
int cnt=;
while(n!=)
{
if(n%==)
cnt++;
n/=;
}
return cnt;
}
bool isleap(int y)
{
if((y%==&&y%!=)||y%==)
return true;
return false;
}
void Init()
{
int sum=;
for(int i=; i<=; ++i)
{
if(isleap(i))
sum=count9(i)*;
else
sum=count9(i)*;
sum+=;
sum+=*;
if(isleap(i))
sum+=;
else
sum+=;
num[i]=sum;
}
}
int mon1[]= {,,,,,,,,,,,,};
int mon2[]= {,,,,,,,,,,,,};
int main()
{
FILE *in=fopen("C:\\Users\\Lenovo\\Desktop\\in.txt","r");
FILE *out=fopen("C:\\Users\\Lenovo\\Desktop\\out_standard.txt","w");
Init();
int t;
//scanf("%d",&t);
fscanf(in,"%d",&t);
while(t--)
{
int y1,m1,d1,y2,m2,d2;
int ans=;
//scanf("%d%d%d%d%d%d",&y1,&m1,&d1,&y2,&m2,&d2);
fscanf(in,"%d%d%d%d%d%d",&y1,&m1,&d1,&y2,&m2,&d2);
if(y1==y2)
{
int days=;
for(int i=m1+; i<m2; ++i)
{
if(i==&&isleap(y1))
ans+=;
else if(i==&&!isleap(y1))
ans+=;
else if(i==)
ans+=;
else
ans+=;
if(!isleap(y1))
days+=mon1[i];
else
days+=mon2[i];
}
if(m1==m2)
{
for(int i=d1; i<=d2; ++i)
{
ans+=count9(i);
days++;
if(m1==)
ans++;
}
ans=ans+days*count9(y1);
//printf("%d\n",ans);
fprintf(out,"%d\n",ans);
}
else
{
if(!isleap(y1))
{
for(int i=d1; i<=mon1[m1]; ++i)
{
ans+=count9(i);
days++;
if(m1==)
ans++;
}
}
else
{
for(int i=d1; i<=mon2[m1]; ++i)
{
ans+=count9(i);
days++;
if(m1==)
ans++;
}
}
for(int i=; i<=d2; ++i)
{
ans+=count9(i);
days++;
if(m2==)
ans++;
}
ans=ans+days*count9(y1);
//printf("%d\n",ans);
fprintf(out,"%d\n",ans);
}
}
else
{
for(int i=y1+; i<y2; ++i)
ans+=num[i];
int days1=,days2=;
for(int i=m1+; i<=; ++i)
{
if(i==&&isleap(y1))
ans+=;
else if(i==&&!isleap(y1))
ans+=;
else if(i==)
ans+=;
else
ans+=;
if(!isleap(y1))
days1+=mon1[i];
else
days1+=mon2[i];
}
if(!isleap(y1))
{
for(int i=d1; i<=mon1[m1]; ++i)
{
ans+=count9(i);
days1++;
if(m1==)
ans++;
}
}
else
{
for(int i=d1; i<=mon2[m1]; ++i)
{
ans+=count9(i);
days1++;
if(m1==)
ans++;
}
}
ans=ans+days1*count9(y1); for(int i=; i<m2; ++i)
{
if(i==&&isleap(y2))
ans+=;
else if(i==&&!isleap(y2))
ans+=;
else if(i==)
ans+=;
else
ans+=;
if(!isleap(y2))
days2+=mon1[i];
else
days2+=mon2[i];
}
for(int i=; i<=d2; ++i)
{
ans+=count9(i);
days2++;
if(m2==)
ans++;
}
ans=ans+days2*count9(y2);
//printf("%d\n",ans);
fprintf(out,"%d\n",ans);
}
} fclose(in);
fclose(out);
return ;
}
自己的程序(目前是错的):
#include <stdio.h>
#include <stdlib.h> int main()
{
FILE *in=fopen("C:\\Users\\Lenovo\\Desktop\\in.txt","r");
FILE *out=fopen("C:\\Users\\Lenovo\\Desktop\\out.txt","w");
long month[]={,,,,,,,,,,,,};
long month_leap[]={,,,,,,,,,,,,};
long tmonth[],tmonth_leap[];
long t,i,j,k,l,s,g,y1,m1,d1,y2,m2,d2,run1,run2,ans=;
long ge[]={},line[];
tmonth[]=;
tmonth_leap[]=;
for (i=;i<;i++)
{
tmonth[i]=tmonth[i-]+month[i];
tmonth_leap[i]=tmonth_leap[i-]+month_leap[i];
}
//2000-01-01 and 9999-12-31
for (i=;i<=;i++)
for (j=;j<=;j++)
for (k=;k<=;k++)
for (l=;l<=;l++)
{
s=i*+j*+k*+l;
g=((i==)+(j==)+(k==)+(l==));
if (s%== && (s%!= || s%==))
ge[s]=*g++;
else
ge[s]=*g++;
}
line[]=;
for (i=;i<=;i++)
line[i]=line[i-]+ge[i];
//scanf("%ld",&t);
fscanf(in,"%ld",&t);
for (l=;l<=t;l++)
{
//scanf("%ld%ld%ld%ld%ld%ld",&y1,&m1,&d1,&y2,&m2,&d2);
fscanf(in,"%ld%ld%ld%ld%ld%ld",&y1,&m1,&d1,&y2,&m2,&d2);
ans=line[y2-]-line[y1-]; g=(y1%==)+(y1/%==)+(y1/%==)+(y1/%==);
if (y1%== && (y1%!= || y1%==))
run1=;
else
run1=;
if (run1==)
ans-=g*tmonth_leap[m1-];
else
ans-=g*tmonth[m1-];
ans-=(d1-)*g; ans-=(m1-)*;
if (d1>=)
ans-=;
else if (d1>=)
ans-=;
else if (d1>=)
ans-=;
if (run1== && m1>)
ans++; if (m1>)
ans-=;
else if (m1==)
ans-=(d1-); g=(y2%==)+(y2/%==)+(y2/%==)+(y2/%==);
if (y2%== && (y2%!= || y2%==))
run2=;
else
run2=;
if (run2==)
ans+=g*tmonth_leap[m2-];
else
ans+=g*tmonth[m2-];
ans+=d2*g; ans+=(m2-)*;
if (d2>=)
ans+=;
else if (d2>=)
ans+=;
else if (d2>=)
ans+=;
if (run2== && m2>)
ans--; if (m2>)
ans+=;
else if (m2==)
ans+=d1; //printf("%ld\n",ans);
fprintf(out,"%ld\n",ans);
} fclose(in);
fclose(out);
return ;
}
/*
9999 1 19 9999 12 21
*/
3.创建数据:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define num 100 int main()
{
FILE *out=fopen("C:\\Users\\Lenovo\\Desktop\\in.txt","w");
long month[]={,,,,,,,,,,,,};
long month_leap[]={,,,,,,,,,,,,};
long y1,m1,d1,y2,m2,d2,i,t;
srand(time(NULL));
fprintf(out,"%ld\n",num);
for (i=;i<=num;i++)
{
y1=+rand()%;
y2=+rand()%;
if (y1>y2)
{
t=y1;
y1=y2;
y2=t;
}
m1=rand()%+;
m2=rand()%+;
if (y1==y2 && m1>m2)
{
t=m1;
m1=m2;
m2=t;
}
if (y1%== && (y1%!= || y1%==))
d1=rand()%month_leap[m1]+;
else
d1=rand()%month[m1]+;
if (y2%== && (y2%!= || y2%==))
d2=rand()%month_leap[m2]+;
else
d2=rand()%month[m2]+;
if (y1==y2 && m1==y2 && d1>d2)
{
t=d1;
d1=d2;
d2=t;
}
fprintf(out,"%ld %ld %ld %ld %ld %ld\n",y1,m1,d1,y2,m2,d2);
}
fclose(out);
system("C:\\Users\\Lenovo\\Desktop\\test_c\\bin\\Debug\\test_c.exe");
system("C:\\Users\\Lenovo\\Desktop\\The_17th_Zhejiang_University_Programming_Contest_Sponsored_by_TuSimple\\c_sumbit\\bin\\Debug\\c_sumbit.exe");
system("C:\\Users\\Lenovo\\Desktop\\Judge_Correct\\bin\\Debug\\Judge_Correct.exe"); return ;
}
4.判断对错程序(自己程序与标准程序输出的区别,具体到哪一行是错的):
#include <stdio.h>
#include <stdlib.h> int main()
{
FILE *in1=fopen("C:\\Users\\Lenovo\\Desktop\\out.txt","r");
FILE *in2=fopen("C:\\Users\\Lenovo\\Desktop\\out_standard.txt","r"); long x,y,ans=; while (fscanf(in1,"%ld",&x)!=EOF && fscanf(in2,"%ld",&y)!=EOF)
{
ans++;
if (x!=y)
{
printf("Line %ld !",ans);
printf("Wrong\n");
fclose(in1);
fclose(in2);
return ;
}
}
if (fscanf(in1,"%ld",&x)!=EOF || fscanf(in2,"%ld",&y)!=EOF)
{
printf("Wrong\n");
fclose(in1);
fclose(in2);
return ;
}
printf("Correct\n");
fclose(in1);
fclose(in2);
return ;
}
5.执行程序,查看自己程序的错误
Output(etc):
Line 5 !
Wrong
6.查看错误的答案所对应的数据有什么共通的地方(那个地方就是你错误所在的地方),修改程序,直到自己程序是对的(多运行几次,因为数据是随机生成的)。
建议:
1.像这种模拟题提交前自己重新过一遍自己的程序,多设置几个特殊(特殊情况)和普遍(多种多样)的测试点。
2.平时做题注意收藏题目数据和官方解题报告,做一道题真正的收获是发现不足(没测试数据会让你卡在同一个地方)和学习新知识和方法(别人的解题过程)。
ZOJ_3950_How Many Nines 解题报告及如何对程序进行测试修改的更多相关文章
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- 二模13day1解题报告
二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- 习题:codevs 2822 爱在心中 解题报告
这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...
- 习题:codevs 1035 火车停留解题报告
本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...
- 习题: codevs 2492 上帝造题的七分钟2 解题报告
这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...
- 习题:codevs 1519 过路费 解题报告
今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
- LeetCode 解题报告索引
最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- 701 C. They Are Everywhere
链接 [http://codeforces.com/group/1EzrFFyOc0/contest/701/problem/C] 题意 给你一个包含大小写字母长度为n的字符串,让你找包含所有种类字符 ...
- 使用highcharts绘制美观的燃尽图
使用highcharts绘制美观的燃尽图 助教在博客中介绍了两种绘制燃尽图的方法,但是我们组在使用时发现有些任务不适合写进issue,而且网站生成的燃尽图不是很美观,因此我们打算使用其他方法自己绘制燃 ...
- Linux 实验一 基础实践
Linux 实践一 1:软件源的维护方法 删掉DEB打头的 在命令行中输入命令时,可以用命令补全的方法. 下载完成后,使用sudo dpkg-i skype.deb 来完成安装. 2:掌握Linux ...
- Linux内核分析第三周学习总结
Linux内核源码简介 arch/ 该目录中包含和硬件体系结构相关的代码,每种平台占一个相应的目录. 和32位PC相关的代码存放在x86目录下. 每种平台至少包含3个子目录:kernel(存放支持体系 ...
- 开源通用爬虫框架YayCrawler-框架的运行机制
这一节我将向大家介绍一下YayCrawler的运行机制,首先允许我上一张图: 首先各个组件的启动顺序建议是Master.Worker.Admin,其实不按这个顺序也没关系,我们为了讲解方便假定是这个启 ...
- GCP试用到期再申请
目标 GCP的免费试用到期了.网传可以续用,看了教程,记录下来. 法一 应该可以直接用一个新gmail账号的.这个方法的难点可能在于注册新账号有门槛.我有一个很久以前注册过的,试着找回了密码,登入GC ...
- HTML使用button的一个小坑
https://www.w3schools.com/TAGs/att_button_type.asp Definition and Usage The type attribute specifies ...
- C语言ODBC数据库操作
今天我们来介绍一下C语言操作数据库的方法,这里我们使用的是ODBC方式.环境是WIN7+VC6.其他环境也差不多,具体情况具体分析. 首先是环境的配置以及数据源的添加.这里就不去解释了,相关资料网上有 ...
- [转帖]ASP.NET的版本?
ASP.NET的版本? https://www.cnblogs.com/guogangj/p/8526365.html 问题源于这么一本书: <ASP.NET 4 解密(卷1)>,这本书大 ...
- QQ互联登录提示redirect uri is illegal(100010)完美解决方法
大概2015年3月低,腾讯QQ互联开发平台调整了有关QQ登录应用回调地址填写规则,用来修复QQ登录过程因回调地址的漏洞可能导致存在的安全问题. 博主接触这块较多,但也是四月才了解此事,从4月起,所有新 ...