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. ruby安装及升级

    在centos6.x下执行上面的"gem install redis"操作可能会报错,坑很多!默认yum安装的ruby版本是1.8.7,版本太低,需要升级到ruby2.2以上,否则 ...

  2. Gitblit版本服务器环境部署记录

    Gitblit介绍Gitblit 是一个纯 Java 库用来管理.查看和处理 Git 资料库.相当于 Git 的 Java 管理工具,支持linux系统.Git是分布式版本控制系统,它强调速度.数据一 ...

  3. python基础学习笔记(十三)

    re模块包含对 正则表达式.本章会对re模块主要特征和正则表达式进行介绍. 什么是正则表达式 正则表达式是可以匹配文本片段的模式.最简单的正则表达式就是普通字符串,可以匹配其自身.换包话说,正则表达式 ...

  4. linux-文件流4种读取方式

    第二种方式 第三种 第四种: 小括号在管道符的右边开辟了两个子进程 大括号在管道符的右边开辟了一个子进程, export 用来导出子进程的 num 还可以借助外部文件进行 七步扩展:

  5. Daily Scrumming* 2015.12.20(Day 12)

    一.团队scrum meeting照片 二.成员工作总结 姓名 任务ID 迁入记录 江昊 任务1090 https://github.com/buaaclubs-team/temp-front/com ...

  6. ngnix使用超时响应时间配置避坑一例

    ngnix的超时响应时间配置得比tomcat的spring mvc响应时间还小,悲剧就发生了,生产环境还不易发现. 就好比定制固定木柜没考虑进门的尺寸,横竖斜都进不去,太悲剧了.哈哈哈,以此为鉴!~

  7. Appium学习笔记1_获取到APK安装包的Package以及Activity属性值

    我们设置DesiredCapabilities属性值得时候需要设置"appPackage"和"appActivity",如何获取到这两个值呢? 这两个值不是随便 ...

  8. 关于适用base64对图片进行编码在服务器上性能的相关讨论

    周五在写open api的时候 和

  9. html5應用緩存

    HTML5使用了應用緩存,就是web應用緩存,使得在離線狀態下可以訪問web'應用. 應用緩存的優點: 離線訪問-可以在無網的狀態下訪問應用 速度-有緩存的應用加載更快 瀏覽器負載-瀏覽器只從服務器加 ...

  10. Lodop打印语句最基本结构介绍(什么是一个任务)

    Lodop中最基本的打印过程至少有初始化语句.添内容语句和打印语句三部分组成,例如: LODOP.PRINT_INIT("打印任务名"); //首先一个初始化语句 LODOP.AD ...