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 解题报告及如何对程序进行测试修改的更多相关文章

  1. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  2. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  3. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  4. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  5. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  6. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  7. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

  8. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  9. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

随机推荐

  1. DRBD详细解说及配置过程记录

    一.DRBD介绍 DRBD(Distributed ReplicatedBlock Device)是一种基于软件的,无共享,分布式块设备复制的存储解决方案,在服务器之间的对块设备(硬盘,分区,逻辑卷等 ...

  2. Ceph常规操作及常见问题梳理

    Ceph集群管理 每次用命令启动.重启.停止Ceph守护进程(或整个集群)时,必须指定至少一个选项和一个命令,还可能要指定守护进程类型或具体例程. **命令格式如 {commandline} [opt ...

  3. restfull环境搭建-helloword

    原文地址:http://blog.csdn.net/u013158799/article/details/39758341 1. REST和RESTful Web Services的简要说明 REST ...

  4. 求去掉一条边使最小割变小 HAOI2017 新型城市化

    先求最小割,然后对残量网络跑Tarjan.对于所有满流的边,若其两端点不在同一个SCC中,则这条边是满足条件的. 证明见 来源:HAOI2017 新型城市化

  5. HDU-6440-费马小定理

    亏我前几天还学数论呢...没有深入研究费马小定理这个东西...做事情一定要静下心来啊... 题目要求满足(m+n)^p=m^p+n^p,要你定义一个封闭的新的加法和乘法运算 我们知道费马小定理中有两种 ...

  6. easyUI中numberbox的校验

    例:两个numberbox(A,B),其中两个都为必填项,要求在文本框显示红色,来显示其是必填项,其中只有当A填完之后,在能允许B进行填写,否则给出提示框,并清空其中的数据 <!DOCTYPE ...

  7. 必应词典案例分析——个人博客作业week3

    案例分析 ——必应词典客户端 软件缺陷常常又被叫做Bug,即为计算机软件或程序中存在的某种破坏正常运行能力的问题.错误,或者隐藏的功能缺陷. 缺陷的存在会导致软件产品在某种程度上不能满足用户的需要.I ...

  8. Abstractive Summarization

    Sequence-to-sequence Framework A Neural Attention Model for Abstractive Sentence Summarization Alexa ...

  9. checkbox未选中不提交数据

    如果checkbox为选中的话提交的数据为NULL function checkForm() { alert(($("#checkbox").get(0).checked)); i ...

  10. 软件工程(四)数据流图DFD

    结构化分析中,常用到数据模型为实体关系图,功能模型是数据流图 DFD 可以认为,一个基于计算机的信息处理系统由数据流和一系列的转换构成,这些转换将输入数据流变换为输出数据流.数据流图就是用来刻画数据流 ...