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,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中...... ...
随机推荐
- 浏览器跨域请求之credentials
-时间起源- 前段时间,需要弄个简单的网站出来,访问远程的api服务. 我是这么做的.首先是在搭建一个nodejs服务来运行前端页面.在我请求登录的时候,能成功返回相应的成功信息.然后,当我再次请求读 ...
- linux-流程控制语言
if: for: 增强for循环 while: 统计这个目录下所有文件的大小 编写脚本 执行 help text:
- vue侧边栏导航和右边内容一样高
vue侧边栏导航和右边内容一样高吗? 失败了,最后用做导航和上导航 定位, 右内容类似滚动条 效果: 直接把top导航和左侧导航栏display:flxed定位左边,右边内容left: top
- C++STL——优先队列
一.相关定义 优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素.但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队.这 ...
- 20135316王剑桥Linux内核学习记笔记第七周
20135316王剑桥<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 一.可执行程序是怎么得来的? 编译 ...
- git心得
使用Git得到了以下体会: github在新的目录下添加新的文件 git init //在相应的目录下添加 git add //添加目录 git commit -m "first commi ...
- jQuery(六)
$下常用方法 $().xxx:只能给jq对象用 $.xxx不仅可以给jq用也可以给原生js用,叫做工具方法 $.type() <script> $(function(){ var a= n ...
- Weblogic 9.2和10.3 改密码 一站完成
Weblogic 9.2和10.3可通用,只需修改参照如下配置即可: SET BEA_HOME=F:\beaSET JRE_HOME=%BEA_HOME%\jdk150_04\binSET LIB_H ...
- No input file specified ci
1. php.ini(/etc/php5/cgi/php.ini)的配置中这两项cgi.fix_pathinfo=1 (这个是自己添加的)
- mysql学习笔记二 —— 权限体系
要点: 1.MySQL的API2.MySQL的相关文件3.MySQL的权限体系 1.MySQL的API 应用程序接口 (application program interface) 1.1 命令行中的 ...