总目录详见https://blog.csdn.net/mrcrack/article/details/84471041
做题原则,找不到测评地址的题不做。2018-11-28
重走长征路---OI每周刷题记录---9月21日 2013
本周共计17题。
测评地址:
1.整数去位 //在线测评地址http://acm.swust.edu.cn/#/problems/433/-1?_k=4ol6pr
2.高精度加法 //在线测评地址http://ybt.ssoier.cn:8088/problem_show.php?pid=1168
3.减法 //在线测评https://www.luogu.org/problemnew/show/P2142
4.乘法 //在线测评https://www.luogu.org/problemnew/show/P1303
dp
5.城市交通 //在线测评地址http://218.5.5.242:9018/JudgeOnline/problem.php?id=1260
6.硬币找零 //在线测评地址http://202.194.119.110/problem.php?id=1720&csrf=0B2KstFn41t92jvpToLxrC3kHDjNHlzm
dfs
7.整数拆分 //在线测评地址http://ybt.ssoier.cn:8088/problem_show.php?pid=1318
8.数的计算 //在线测评地址https://www.luogu.org/problemnew/show/P1028
模拟
9.ISBN //在线测评地址https://www.luogu.org/problemnew/show/P1055
10.奖学金 //在线测评地址https://www.luogu.org/problemnew/show/P1051
11.数字统计 //在线测评地址https://www.luogu.org/problemnew/show/P1179
12.统计数字 //在线测评地址https://www.luogu.org/problemnew/show/P1097
13.关于马的问题 //在线测评地址http://218.5.5.242:9018/JudgeOnline/problem.php?id=1285
蛇形填数
14.小鱼吃虾米 //在线测评地址http://oj.jjyz.net:9016/JudgeOnline/problem.php?id=1050
递推
15.过河卒 //题目阅读地址https://wenku.baidu.com/view/3632f38655270722192ef7cc.html
//在线测评地址https://www.luogu.org/problemnew/show/P1002
16.数字三角形 //在线测评地址https://www.luogu.org/problemnew/show/P1216
字符串
17.统计单词数 //在线测评地址https://www.luogu.org/problemnew/show/P1308
题解:
1.整数去位
//高精度整数去位去最小问题
//在线测评地址http://acm.swust.edu.cn/#/problems/433/-1?_k=4ol6pr
//用户名mrwalking
//学号20180901
//1321:【例6.3】删数问题(Noip1994) 在线测评地址http://ybt.ssoier.cn:8088/problem_show.php?pid=1321
//P1106 删数问题 在线测评地址https://www.luogu.org/problemnew/show/P1106
//数据左向右扫描,找出第一个峰,去除该峰,每次重复如此
//456547 2
//第一步456(峰)547 去除6 剩45547
//第二步455(峰)47 去除5 剩4547
//仔细想了想,这种方式,超时无疑,必须换算法。
//再想了想,发现,误判m,m不超过240,还是用老算法,不超时。
//测算,240个例子,240*240*240=1.4*10^7,基本不超时
//样例通过,提交AC,甚是高兴。2018-11-28
//心得,找峰的算法,相当得意。 while(k<=x[0]&&x[k]<=x[k+1])k++;//找到峰的位置
#include <stdio.h>
#include <string.h>
#define maxn 260
char n[maxn];
int x[maxn],m;
void read(char *s,int len,int *a){
int i;
a[0]=len;
for(i=1;i<=len;i++)
a[i]=s[i-1]-'0';
}
int main(){
int len,k,i;
while(scanf("%s%d",n,&m)!=EOF){//竟然出现这个错误 while(scanf("%s%d",n,m)!=EOF)
memset(x,0,sizeof(x));
len=strlen(n);
read(n,len,x);
while(m--){//重复次数m
k=1;
while(k<=x[0]&&x[k]<=x[k+1])k++;//找到峰的位置
for(i=k;i<x[0];i++)//去除峰,k右侧整数左移
x[i]=x[i+1];
x[0]--;
}
for(i=1;i<=x[0];i++)
printf("%d",x[i]);
printf("\n");
}
return 0;
}
2.高精度加法
//1168:大整数加法
//在线测评地址http://ybt.ssoier.cn:8088/problem_show.php?pid=1168
//特征,该题难度够大
//第一步,去除前导0
//第二步,加法
//123456789
//该问题很重要的一点,是编一步,测一步。
//000123456789
//样例通过,提交AC。2018-11-27
//编写思路不再凌乱,按部就班,有条理。
#include <stdio.h>
#include <string.h>
#define maxn 210
int x[maxn],y[maxn],z[maxn];
void zero(char *s,int len,int *a){//整合数据
int i,k=1;
for(i=len-1;i>=0;i--)//低位存储低位
a[k++]=s[i]-'0';
a[0]=k-1;//当前数字串,总长度
for(i=a[0];i>=1;i--)//去除前导0
if(a[i])break;
else a[0]--;
}
void read(int *a){//读取整数
int len;
char s[maxn];
scanf("%s",s);
len=strlen(s);
zero(s,len,a);//此处写成 zero(s,len,x);
}
void add(int *a,int *b,int *c){
int i;
c[0]=a[0]>b[0]?a[0]:b[0];//找出最长串的长度
for(i=1;i<=c[0];i++){
c[i]+=(a[i]+b[i]);//此处写成 c[i]=a[i]+b[i];
c[i+1]+=c[i]/10;//进位
c[i]%=10;
}
if(c[i])c[0]+=1;//看是否需要增加一位
}
int main(){
int i;
memset(x,0,sizeof(x)),memset(y,0,sizeof(y)),memset(z,0,sizeof(z));
read(x),read(y);
add(x,y,z);
for(i=z[0];i>=1;i--)
printf("%d",z[i]);
return 0;
}
3.减法
//P2142 高精度减法
//在线测评https://www.luogu.org/problemnew/show/P2142
//选该题的原因,是够难
//样例通过,提交AC。2018-11-27
#include <stdio.h>
#include <string.h>
#define maxn 10100
int x[maxn],y[maxn],z[maxn];
char s[maxn];
void read(int *a){
int len,k,i;
scanf("%s",s);
len=strlen(s);
a[0]=len,k=1;
for(i=len-1;i>=0;i--)//逆序存储
a[k++]=s[i]-'0';
for(i=x[0];i>=1;i--)//去除前导0
if(x[i])break;
else x[0]--;
}
int compare(int *a,int *b){//a>b返回1,a=b返回0,a<b返回-1
int i;
if(a[0]>b[0])return 1;
if(a[0]<b[0])return -1;
if(a[0]==b[0])
for(i=a[0];i>=1;i--)
if(a[i]>b[i])return 1;
else if(a[i]<b[i])return -1;
return 0;
}
void sub(int *a,int *b,int *c){//a>b
int i;
c[0]=a[0];
for(i=1;i<=c[0];i++){
c[i]+=(a[i]-b[i]);
if(c[i]<0){//退位处理
c[i+1]-=1;
c[i]+=10;
}
}
for(i=c[0];i>=1;i--)//去除前导0
if(c[i])break;
else c[0]--;
}
int main(){
int i;
memset(x,0,sizeof(x)),memset(y,0,sizeof(y)),memset(z,0,sizeof(z));
read(x),read(y);
if(compare(x,y)==0){//仔细想了想,0还是特判比较方便
printf("0");
return 0;
}
if(compare(x,y)==1)
sub(x,y,z);
else{
printf("-");
sub(y,x,z);
}
for(i=z[0];i>=1;i--)
printf("%d",z[i]);
return 0;
}
4.乘法
//P1303 A*B Problem
//在线测评https://www.luogu.org/problemnew/show/P1303
//同等类型题目,该题较难
//该题有个特例要注意,若输入为0
//样例通过,提交AC。2018-11-28
#include <stdio.h>
#include <string.h>
#define maxn 2100
int x[maxn],y[maxn],z[maxn+maxn];
char s[maxn];
void read(int *a){
int len,i,k=1;
scanf("%s",s);
len=strlen(s),a[0]=len;
for(i=len-1;i>=0;i--)
a[k++]=s[i]-'0';
for(i=a[0];i>=1;i--)//去除前导0
if(a[i])break;
else a[0]--;
}
void mul(int *a,int *b,int *c){
int i,j;
c[0]=a[0]+b[0];
for(i=1;i<=a[0];i++)
for(j=1;j<=b[0];j++){
c[i+j-1]+=a[i]*b[j];
c[i+j-1+1]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
for(i=c[0];i>=1;i--)//此处写成for(i=c[0];i>=1;i++)查了10分钟//去除前导0
if(c[i])break;
else c[0]--;
}
int main(){
int i;
memset(x,0,sizeof(x)),memset(y,0,sizeof(y)),memset(z,0,sizeof(z));
read(x),read(y);
if(x[0]==0||y[0]==0){//输入为0,特判
printf("0");
return 0;
}
mul(x,y,z);
for(i=z[0];i>=1;i--)
printf("%d",z[i]);
return 0;
}
dp
5.城市交通
//1260: 城市交通
//在线测评地址http://218.5.5.242:9018/JudgeOnline/problem.php?id=1260
//用户名20180901
//看完题目,发现Floyd算法即可。
//看完样例,发现是 无向图
//没说明两道路间最大距离,对INF的设定,造成了困难
//样例通过,提交AC。2019-1-11 20:03
#include <stdio.h>
#define maxn 110
#define INF 99999999
int map[maxn][maxn],n;
int main(){
int i,j,k,d;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j)map[i][j]=0;
else map[i][j]=INF;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
scanf("%d",&d);
if(d>0)map[i][j]=d;
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
printf("%d\n",map[1][n]);
return 0;
}
6.硬币找零
//1720: 最少硬币问题
//在线测评地址http://202.194.119.110/problem.php?id=1720&csrf=0B2KstFn41t92jvpToLxrC3kHDjNHlzm
//学号20180901 用户名mrcrack
//多重背包问题,不同之处在于求最小值
//模拟是关键,题中样例数据模拟如下
//样例通过,
//提交运行错误,发现 f[15][20100];//看花眼了,此处写成 f[15][2100]
//继续提交,答案错误,发现#define INF 99999//此处写成 #define INF 9999
//继续提交,答案错误,if(j>=k*t[i])//漏了此句
//继续提交,答案错误,f[i][0]=0;//此句写成f[0][0]=0;//此句关键,是模拟得出的。
//提交AC。2018-12-8 21:41 从样例通过,到AC,整整又经历了35分钟。
//突然发现,上述 题中样例数据模拟 是错误的,正确如下:
//还是那句话,模拟是关键,要对自己的模拟有信心。
//以下为AC代码。
#include <stdio.h>
#include <string.h>
#define INF 99999//此处写成 #define INF 9999
int t[15],c[15],f[15][20100];//看花眼了,此处写成 f[15][2100]
int min(int a,int b){
return a<b?a:b;
}
int main(){
int n,m,i,j,k;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d%d",&t[i],&c[i]);
scanf("%d",&m);
for(i=0;i<=n;i++)
for(j=0;j<=m;j++)
f[i][j]=INF;//在考虑如何改写该段代码
for(i=0;i<=n;i++)
f[i][0]=0;//此句写成f[0][0]=0;//此句关键,是模拟得出的。
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(j<t[i])
f[i][j]=f[i-1][j];
else
for(k=0;k<=c[i];k++)//此处写成 for(k=1;k<=c[i];k++)
if(j>=k*t[i])//漏了此句
f[i][j]=min(f[i][j],f[i-1][j-k*t[i]]+k);
if(f[n][m]==INF)printf("-1\n");
else printf("%d\n",f[n][m]);
return 0;
}
dfs
7.整数拆分
//1318:【例5.3】自然数的拆分
//在线测评地址http://ybt.ssoier.cn:8088/problem_show.php?pid=1318
//在纸上笔画,觉得算法可行,开始编码
//感觉编的还行,就是打了许多补丁。
//样例通过,提交AC。2018-11-29
//查看了hzwer的代码,觉得不错,进行改进。2018-11-29
#include <stdio.h>
int a[100],n,m;
void dfs(int step){
int i;
if(m==0&&step>2){
printf("%d=%d",n,a[1]);
for(i=2;i<step;i++)printf("+%d",a[i]);
printf("\n");
return;
}
for(i=a[step-1];i<=m;i++){//此处写成 for(i=a[step-1];i<m;i++)
m-=i;
a[step]=i;
dfs(step+1);
m+=i;
}
}
int main(){
scanf("%d",&n);
a[0]=1,m=n;
dfs(1);
return 0;
}
//1318:【例5.3】自然数的拆分
//在线测评地址http://ybt.ssoier.cn:8088/problem_show.php?pid=1318
//在纸上笔画,觉得算法可行,开始编码
//感觉编的还行,就是打了许多补丁。
//样例通过,提交AC。2018-11-29
#include <stdio.h>
int a[100],n,m;
void dfs(int step){
int i,sum=0;
for(i=1;i<step;i++)sum+=a[i];
if(sum==n&&step>2){//此处写成 if(sum==n)
printf("%d=%d",n,a[1]);
for(i=2;i<step;i++)printf("+%d",a[i]);
printf("\n");
return;
}
for(i=a[step-1];i<=m;i++){//此处写成 for(i=a[step-1];i<m;i++)
m-=i;
a[step]=i;
dfs(step+1);
m+=i;
}
}
int main(){
scanf("%d",&n);
a[0]=1,m=n;
dfs(1);
return 0;
}
8.数的计算
方法一
//P1028 数的计算
//NOIP 2001 普及组 第1题 共4题
//在线测评地址https://www.luogu.org/problemnew/show/P1028
//根据打表的数据,及读题分析,可得递归公式
//奇数a[i]=a[i-1]
//偶数a[i]=?+a[i/2]; 再仔细观察,可见a[i]=a[i-1]+a[i/2]
//样例通过,提交AC.2018-12-3
//为了帮助理解代码,举例如下:
//a[7]=6 7 37 137 27 127 17
//a[6]=6 6 36 136 26 126 16
//a[3]=2 3 13
//a[5]=4 5 25 125 15
//a[7]=a[6],a[6]=a[5]+a[3] 2018-12-4
#include <stdio.h>
#define maxn 1100
long long a[maxn];
int main(){
int i,n;
scanf("%d",&n);
a[1]=1,a[2]=2;
for(i=3;i<=n;i++)
if(i%2)a[i]=a[i-1];
else a[i]=a[i-1]+a[i/2];
printf("%lld\n",a[n]);
return 0;
}
1-100的数据如下:
1 1
2 2
3 2
4 4
5 4
6 6
7 6
8 10
9 10
10 14
11 14
12 20
13 20
14 26
15 26
16 36
17 36
18 46
19 46
20 60
21 60
22 74
23 74
24 94
25 94
26 114
27 114
28 140
29 140
30 166
31 166
32 202
33 202
34 238
35 238
36 284
37 284
38 330
39 330
40 390
41 390
42 450
43 450
44 524
45 524
46 598
47 598
48 692
49 692
50 786
51 786
52 900
53 900
54 1014
55 1014
56 1154
57 1154
58 1294
59 1294
60 1460
61 1460
62 1626
63 1626
64 1828
65 1828
66 2030
67 2030
68 2268
69 2268
70 2506
71 2506
72 2790
73 2790
74 3074
75 3074
76 3404
77 3404
78 3734
79 3734
80 4124
81 4124
82 4514
83 4514
84 4964
85 4964
86 5414
87 5414
88 5938
89 5938
90 6462
91 6462
92 7060
93 7060
94 7658
95 7658
96 8350
97 8350
98 9042
99 9042
100 9828
//P1028 数的计算
//NOIP 2001 普及组 第1题 共4题
//在线测评地址https://www.luogu.org/problemnew/show/P1028
//打表代码如下:
#include <stdio.h>
long long cnt;
void dfs(int n){
int i;
for(i=1;i<=n/2;i++){
cnt++;
dfs(i);
}
}
int main(){
int i;
freopen("data.out","w",stdout);
for(i=1;i<=100;i++){
cnt=1;
dfs(i);
printf("%d\t%lld\n",i,cnt);
}
return 0;
}
方法二
//P1028 数的计算
//NOIP 2001 普及组 第1题 共4题
//在线测评地址https://www.luogu.org/problemnew/show/P1028
//测试了n=1000,感觉int 溢出,改成long long
//有些不放心,举了几个例子,都通过
//提交25分,过了测试点1-5,测试点6-20均TLE。
//经测,大约能到n=500,1s,再大,超时
//决定采用打表的方式。
//打表大约耗时30分钟。
//将打表结果,放入程序,提交AC。2018-12-2 20:17
#include <stdio.h>
long long cnt[]={1,1,2,2,4,4,6,6,10,10,14,14,20,20,26,26,36,36,46,46,60,60,74,74,94,94,114,114,140,140,166,166,202,202,238,238,284,284,330,330,390,390,450,450,524,524,598,598,692,692,786,786,900,900,1014,1014,1154,1154,1294,1294,1460,1460,1626,1626,1828,1828,2030,2030,2268,2268,2506,2506,2790,2790,3074,3074,3404,3404,3734,3734,4124,4124,4514,4514,4964,4964,5414,5414,5938,5938,6462,6462,7060,7060,7658,7658,8350,8350,9042,9042,9828,9828,10614,10614,11514,11514,12414,12414,13428,13428,14442,14442,15596,15596,16750,16750,18044,18044,19338,19338,20798,20798,22258,22258,23884,23884,25510,25510,27338,27338,29166,29166,31196,31196,33226,33226,35494,35494,37762,37762,40268,40268,42774,42774,45564,45564,48354,48354,51428,51428,54502,54502,57906,57906,61310,61310,65044,65044,68778,68778,72902,72902,77026,77026,81540,81540,86054,86054,91018,91018,95982,95982,101396,101396,106810,106810,112748,112748,118686,118686,125148,125148,131610,131610,138670,138670,145730,145730,153388,153388,161046,161046,169396,169396,177746,177746,186788,186788,195830,195830,205658,205658,215486,215486,226100,226100,236714,236714,248228,248228,259742,259742,272156,272156,284570,284570,297998,297998,311426,311426,325868,325868,340310,340310,355906,355906,371502,371502,388252,388252,405002,405002,423046,423046,441090,441090,460428,460428,479766,479766,500564,500564,521362,521362,543620,543620,565878,565878,589762,589762,613646,613646,639156,639156,664666,664666,692004,692004,719342,719342,748508,748508,777674,777674,808870,808870,840066,840066,873292,873292,906518,906518,942012,942012,977506,977506,1015268,1015268,1053030,1053030,1093298,1093298,1133566,1133566,1176340,1176340,1219114,1219114,1264678,1264678,1310242,1310242,1358596,1358596,1406950,1406950,1458378,1458378,1509806,1509806,1564308,1564308,1618810,1618810,1676716,1676716,1734622,1734622,1795932,1795932,1857242,1857242,1922286,1922286,1987330,1987330,2056108,2056108,2124886,2124886,2197788,2197788,2270690,2270690,2347716,2347716,2424742,2424742,2506282,2506282,2587822,2587822,2673876,2673876,2759930,2759930,2850948,2850948,2941966,2941966,3037948,3037948,3133930,3133930,3235326,3235326,3336722,3336722,3443532,3443532,3550342,3550342,3663090,3663090,3775838,3775838,3894524,3894524,4013210,4013210,4138358,4138358,4263506,4263506,4395116,4395116,4526726,4526726,4665396,4665396,4804066,4804066,4949796,4949796,5095526,5095526,5248914,5248914,5402302,5402302,5563348,5563348,5724394,5724394,5893790,5893790,6063186,6063186,6240932,6240932,6418678,6418678,6605466,6605466,6792254,6792254,6988084,6988084,7183914,7183914,7389572,7389572,7595230,7595230,7810716,7810716,8026202,8026202,8252302,8252302,8478402,8478402,8715116,8715116,8951830,8951830,9200058,9200058,9448286,9448286,9708028,9708028,9967770,9967770,10239926,10239926,10512082,10512082,10796652,10796652,11081222,11081222,11379220,11379220,11677218,11677218,11988644,11988644,12300070,12300070,12625938,12625938,12951806,12951806,13292116,13292116,13632426,13632426,13988332,13988332,14344238,14344238,14715740,14715740,15087242,15087242,15475494,15475494,15863746,15863746,16268748,16268748,16673750,16673750,17096796,17096796,17519842,17519842,17960932,17960932,18402022,18402022,18862450,18862450,19322878,19322878,19802644,19802644,20282410,20282410,20782974,20782974,21283538,21283538,21804900,21804900,22326262,22326262,22869882,22869882,23413502,23413502,23979380,23979380,24545258,24545258,25135020,25135020,25724782,25724782,26338428,26338428,26952074,26952074,27591230,27591230,28230386,28230386,28895052,28895052,29559718,29559718,30251722,30251722,30943726,30943726,31663068,31663068,32382410,32382410,33130918,33130918,33879426,33879426,34657100,34657100,35434774,35434774,36243644,36243644,37052514,37052514,37892580,37892580,38732646,38732646,39605938,39605938,40479230,40479230,41385748,41385748,42292266,42292266,43234278,43234278,44176290,44176290,45153796,45153796,46131302,46131302,47146570,47146570,48161838,48161838,49214868,49214868,50267898,50267898,51361196,51361196,52454494,52454494,53588060,53588060,54721626,54721626,55897966,55897966,57074306,57074306,58293420,58293420,59512534,59512534,60777212,60777212,62041890,62041890,63352132,63352132,64662374,64662374,66020970,66020970,67379566,67379566,68786516,68786516,70193466,70193466,71651844,71651844,73110222,73110222,74620028,74620028,76129834,76129834,77694142,77694142,79258450,79258450,80877260,80877260,82496070,82496070,84172786,84172786,85849502,85849502,87584124,87584124,89318746,89318746,91114678,91114678,92910610,92910610,94767852,94767852,96625094,96625094,98547380,98547380,100469666,100469666,102456996,102456996,104444326,104444326,106500434,106500434,108556542,108556542,110681428,110681428,112806314,112806314,115004102,115004102,117201890,117201890,119472580,119472580,121743270,121743270,124090986,124090986,126438702,126438702,128863444,128863444,131288186,131288186,133794468,133794468,136300750,136300750,138888572,138888572,141476394,141476394,144150270,144150270,146824146,146824146,149584076,149584076,152344006,152344006,155194954,155194954,158045902,158045902,160987868,160987868,163929834,163929834,166967782,166967782,170005730,170005730,173139660,173139660,176273590,176273590,179508916,179508916,182744242,182744242,186080964,186080964,189417686,189417686,192861218,192861218,196304750,196304750,199855092,199855092,203405434,203405434,207068524,207068524,210731614,210731614,214507452,214507452,218283290,218283290,222177814,222177814,226072338,226072338,230085548,230085548,234098758,234098758,238237116,238237116,242375474,242375474,246638980,246638980,250902486,250902486,255297602,255297602,259692718,259692718,264219444,264219444,268746170,268746170,273411566,273411566,278076962,278076962,282881028,282881028,287685094,287685094,292634890,292634890,297584686,297584686,302680212,302680212,307775738,307775738,313024652,313024652,318273566,318273566,323675868,323675868,329078170,329078170,334641518,334641518,340204866,340204866,345929260,345929260,351653654,351653654,357547444,357547444,363441234,363441234,369504420,369504420,375567606,375567606,381808538,381808538,388049470,388049470,394468148,394468148,400886826,400886826,407492292,407492292,414097758,414097758,420890012,420890012,427682266,427682266,434670350,434670350,441658434,441658434,448842348,448842348,456026262,456026262,463415834,463415834,470805406,470805406,478400636,478400636,485995866,485995866,493806582,493806582,501617298,501617298,509643500,509643500,517669702,517669702,525922004,525922004,534174306,534174306,542652708,542652708,551131110,551131110,559846226,559846226,568561342,568561342,577513172,577513172,586465002,586465002,595665060,595665060,604865118,604865118,614313404,614313404,623761690,623761690,633469718,633469718,643177746,643177746,653145516,653145516,663113286,663113286,673353212,673353212,683593138,683593138,694105220,694105220,704617302,704617302,715413954,715413954,726210606,726210606,737291828,737291828,748373050,748373050,759752270,759752270,771131490,771131490,782808708,782808708,794485926,794485926,806474570,806474570,818463214,818463214,830763284,830763284,843063354,843063354,855689292,855689292,868315230,868315230,881267036,881267036,894218842,894218842,907510958,907510958,920803074,920803074,934435500,934435500,948067926,948067926,962056258,962056258,976044590,976044590,990388828,990388828,1004733066,1004733066,1019448806,1019448806,1034164546,1034164546,1049251788,1049251788,1064339030,1064339030,1079814524,1079814524,1095290018,1095290018,1111153764,1111153764,1127017510,1127017510,1143286258,1143286258,1159555006,1159555006,1176228756,1176228756,1192902506,1192902506,1209999302,1209999302,1227096098,1227096098,1244615940,1244615940,1262135782,1262135782,1280096714,1280096714,1298057646,1298057646,1316459668,1316459668,1334861690,1334861690,1353724140,1353724140,1372586590,1372586590,1391909468,1391909468,1411232346,1411232346,1431034990,1431034990,1450837634,1450837634,1471120044,1471120044,1491402454,1491402454,1512185428,1512185428,1532968402,1532968402,1554251940,1554251940,1575535478,1575535478,1597340378,1597340378,1619145278,1619145278,1641471540,1641471540,1663797802,1663797802,1686667684,1686667684,1709537566,1709537566,1732951068,1732951068,1756364570,1756364570,1780343950,1780343950,1804323330,1804323330,1828868588,1828868588,1853413846,1853413846,1878548866,1878548866,1903683886,1903683886,1929408668,1929408668,1955133450,1955133450,1981471878};
int main(){
int n;
scanf("%d",&n);
printf("%lld\n",cnt[n]);
return 0;
}
打表代码如下:
//P1028 数的计算
//NOIP 2001 普及组 第1题 共4题
//在线测评地址https://www.luogu.org/problemnew/show/P1028
//测试了n=1000,感觉int 溢出,改成long long
//有些不放心,举了几个例子,都通过
//提交25分,过了测试点1-5,测试点6-20均TLE。
//决定采用打表的方式。
//打表大约耗时30分钟。
#include <stdio.h>
long long cnt;
void dfs(int n){
int i;
for(i=1;i<=n/2;i++){
cnt++;
dfs(i);
}
}
int main(){
int i;
freopen("data.out","w",stdout);
for(i=1;i<=1000;i++){
cnt=1;
dfs(i);
printf("%lld,",cnt);
}
return 0;
}
25分代码如下:
//P1028 数的计算
//NOIP 2001 普及组 第1题 共4题
//在线测评地址https://www.luogu.org/problemnew/show/P1028
//测试了n=1000,感觉int 溢出,改成long long
//有些不放心,举了几个例子,都通过
//提交25分,过了测试点1-5,测试点6-20均TLE。
//决定采用打表的方式。
#include <stdio.h>
long long cnt=1;
void dfs(int n){
int i;
for(i=1;i<=n/2;i++){
cnt++;
dfs(i);
}
}
int main(){
int n;
scanf("%d",&n);
dfs(n);
printf("%lld\n",cnt);
return 0;
}
模拟
9.ISBN
//P1055 ISBN号码
//在线测评地址https://www.luogu.org/problemnew/show/P1055
//NOIP 2008 普及组 第1题 共4题
//题目比较简单
//提交前,比较慎重的测了X的情况
//0-670-83162-X
//Right
//样例通过,提交AC。2018-11-28
//编写过程中,逻辑比较顺畅。
#include <stdio.h>
char s[20];
int main(){
int sum;
scanf("%s",s);
sum=(s[0]-'0')*1+(s[2]-'0')*2+(s[3]-'0')*3+(s[4]-'0')*4+(s[6]-'0')*5+(s[7]-'0')*6+(s[8]-'0')*7+(s[9]-'0')*8+(s[10]-'0')*9;
if(s[12]=='X'){
if(sum%11==10)printf("Right");
else{
s[12]='\0';
printf("%s%d",s,sum%11);
}
}else{
if(sum%11==10){
s[12]='\0';
printf("%sX",s);
}else{
if(sum%11==s[12]-'0')//此处写成if(sum%11==s[12])
printf("Right");
else{
s[12]='\0';
printf("%s%d",s,sum%11);
}
}
}
return 0;
}
10.奖学金
//P1051 谁拿了最多奖学金
//在线测评地址https://www.luogu.org/problemnew/show/P1051
//NOIP 2005 提高组 第1题 共4题
//有一点要注意,对输入数据,要进行输出测试,看是否读取一致。
//该题,直接读字符会有问题,转成读取字符串的形式。
//样例通过,提交AC。2018-11-29
#include <stdio.h>
#include <string.h>
int award(int score1,int score2,char g,char w,int p){
int ans=0;
if(score1>80&&p>=1)ans+=8000;
if(score1>85&&score2>80)ans+=4000;
if(score1>90)ans+=2000;
if(score1>85&&w=='Y')ans+=1000;
if(score2>80&&g=='Y')ans+=850;
return ans;
}
int main(){
int i,sum=0,max=-1,money;
char name[30],g[5],w[5],stu[30];
int score1,score2,p,n;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%s%d%d%s%s%d",name,&score1,&score2,g,w,&p);
money=award(score1,score2,g[0],w[0],p);
if(max<money)strcpy(stu,name),max=money;
sum+=money;
}
printf("%s\n%d\n%d\n",stu,max,sum);
return 0;
}
11.数字统计
//P1179 数字统计
//NOIP 2010 普及组 第1题 共4题
//在线测评地址https://www.luogu.org/problemnew/show/P1179
//算法的时间复杂度100000*6=6*10^5 100000解析共6个数字
//6*100000=6*10^5故int不会溢出
//该题算法,将一个整数解析成一个一个的数字
//样例通过,提交AC。2018-11-28
#include <stdio.h>
int count(int n){
int ans=0;
while(n){
if(n%10==2)ans++;
n/=10;
}
return ans;
}
int main(){
int ans=0,i,L,R;
scanf("%d%d",&L,&R);
for(i=L;i<=R;i++)
ans+=count(i);
printf("%d\n",ans);
return 0;
}
12.统计数字
//P1097 统计数字
//NOIP 2007 提高组 第1题 共4题
//在线测评地址https://www.luogu.org/problemnew/show/P1097
//第一步,排序,采用C++
//第二步,统计
//样例通过,提交之前,慎重了,多测了几组数据
//提交,AC。2018-11-28
#include <cstdio>
#include <algorithm>
#define maxn 200100
int a[maxn];
using namespace std;
int main(){
int n,i,cnt;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+1+n);//默认,自小到大排序
cnt=1;
for(i=2;i<=n;i++)
if(a[i]==a[i-1])
cnt++;
else{
printf("%d %d\n",a[i-1],cnt);
cnt=1;
}
printf("%d %d\n",a[n],cnt);//最后一位处理
return 0;
}
13.关于马的问题
//1285: 关于马的问题
//在线测评地址http://218.5.5.242:9018/JudgeOnline/problem.php?id=1285
//用户名20180901
//纯模拟,先排序,找不同颜色的数量
//4扣除上述结果即可
//样例通过,提交,AC。2019-1-11 21:57
#include <stdio.h>
int c[6];
int main(){
int i,j,t,cnt=1;
for(i=1;i<=4;i++)scanf("%d",&c[i]);
for(i=1;i<=4;i++)
for(j=i+1;j<=4;j++)
if(c[i]>c[j])//自小到大排序
t=c[i],c[i]=c[j],c[j]=t;
for(i=2;i<=4;i++)
if(c[i]!=c[i-1])cnt++;
printf("%d\n",4-cnt);
}
蛇形填数
14.小鱼吃虾米 在线测评地址http://oj.jjyz.net:9016/JudgeOnline/problem.php?id=1050
网站用户名:20180901
//1050: 小鱼吃虾米
//在线测评地址http://oj.jjyz.net:9016/JudgeOnline/problem.php?id=1050
//期望编写时间复杂度较低的代码
//基本思路:总数-未吃掉的虾米=吃掉的虾米
//考虑,不是太好编,换思路,1圈的个数(n-2)+(n-2)+n+n=4*n-4
//考虑采用递归的方式来处理。
//最终的编码,还是采用一圈一圈的处理方式,从外围到内部,该题的难点是,
//外围每减少一圈,内部的起始,与结束的坐标 确定。
//样例通过,并对各种可能情况进行了测试,提交,AC。2018-11-25 14:14
#include <stdio.h>
#include <math.h>
#define maxn 1000
int n,k,a[maxn][maxn];
int main(){
int i,j,ans=0,m,q,flag;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
m=n,q=0,flag=0;//q圈数
while(k){
if(k>4*m-4){//k大于当前一圈的堆数
for(i=1+q;i<=n-q;i++)ans+=a[i][1+q];//首列
for(i=1+q+1;i<=n-q-1;i++)ans+=a[n-q][i];//尾行 除 重复
for(i=n-q;i>=1+q;i--)ans+=a[i][n-q];//尾列 除 重复
for(i=n-q-1;i>=1+q+1;i--)ans+=a[1+q][i];//首行
k-=(4*m-4),m-=2,q++;
}else{//k小于当前一圈的堆数
for(i=1+q;i<=n-q;i++){//此处写成 for(i=1+q;i<=n-2*q;i++)
ans+=a[i][1+q];
k--;
if(k==0){
flag=1;
break;
}
}
if(flag)break;
for(i=1+q+1;i<=n-q-1;i++){
ans+=a[n-q][i];
k--;
if(k==0){
flag=1;
break;
}
}
if(flag)break;
for(i=n-q;i>=1+q;i--){
ans+=a[i][n-q];
k--;
if(k==0){
flag=1;
break;
}
}
if(flag)break;
for(i=n-q-1;i>=1+q+1;i--){
ans+=a[1+q][i];
k--;
if(k==0){
flag=1;
break;
}
}
if(flag)break;
}
}
printf("%d",ans);
return 0;
}
递推
15.过河卒
//P1002 过河卒
//NOIP 2002 普及组 第4题 共4题
//题目阅读地址https://wenku.baidu.com/view/3632f38655270722192ef7cc.html
//在线测评地址https://www.luogu.org/problemnew/show/P1002
//建议上面两个地址的内容结合起来看。
//f[i][j]为到达(i,j)的路径数
//先全初始化f[i][j]=-1
//初始化为f[0][j]=1,f[i][0]=1,若遇到马的控制点或马点,则,该控制点或马点之后的行或列为0 此处是难点
//马的控制点处f[i][j]=0,且不能改变数值。
//f[0][0]=1
//递推关系f[i][j]=f[i][j-1]+f[i-1][j];
//因 说明中 结果可能很大! 将int改成long long
//样例通过,提交AC。2018-11-26
#include <stdio.h>
#include <string.h>
#define maxn 30
int n,m,x,y;
long long f[maxn][maxn];//将int改成long long
int next[][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}};
int main(){
int i,j,k,nx,ny;
memset(f,-1,sizeof(f));//此处写成 memset(f,-1,sizeof(-1));查了会
scanf("%d%d%d%d",&n,&m,&x,&y);
for(j=0;j<=m;j++)f[0][j]=1;
for(i=0;i<=n;i++)f[i][0]=1;
f[x][y]=0;//漏了此句
if(x==0)
for(j=y;j<=m;j++)
f[0][j]=0;
if(y==0)
for(i=x;i<=n;i++)
f[i][0]=0;
for(k=0;k<8;k++){//此处写成 for(i=0;i<8;i++)
nx=x+next[k][0],ny=y+next[k][1];
if(0<=nx&&nx<=n&&0<=ny&&ny<=m){
f[nx][ny]=0;
if(nx==0)
for(j=ny;j<=m;j++)
f[0][j]=0;
if(ny==0)
for(i=nx;i<=n;i++)
f[i][0]=0;
}
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(f[i][j]==-1)
f[i][j]=f[i][j-1]+f[i-1][j];
printf("%lld\n",f[n][m]);
return 0;
}
16.数字三角形
//P1216 [USACO1.5]数字三角形 Number Triangles
//在线测评地址https://www.luogu.org/problemnew/show/P1216
//动态规划,转移方程 该层值=之前该层值+max{下一层该位置值,下一层该位置右侧值}
//a[i][j]=max(a[i][j]+a[i+1][j],a[i][j]+a[i+1][j+1]);//转移方程
//样例通过,提交AC,感觉是,编写较以往,快了许多。2018-11-26
#include <stdio.h>
#include <string.h>
#define maxn 1100
int a[maxn][maxn],n;
int max(int a,int b){
return a>b?a:b;
}
int main(){
int i,j;
memset(a,0,sizeof(a));
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
scanf("%d",&a[i][j]);
for(i=n-1;i>=1;i--)
for(j=1;j<=i;j++)
a[i][j]=max(a[i][j]+a[i+1][j],a[i][j]+a[i+1][j+1]);//转移方程
printf("%d\n",a[1][1]);
return 0;
}
字符串
17.统计单词数
//P1308 统计单词数
//NOIP 2011 普及组 第2题 共4题
//在线测评地址https://www.luogu.org/problemnew/show/P1308
//该题难在,空格可以到处出现,而且不限频率
//参看了题解,寻求一种能想得到,编写又不容易出现错误的编码方式。
//将a串首尾都+空格,将b串首尾都+空格,这样能保证,找到的是同一单词。
//采用gets一行一行读入。
//编码,样例通过,很快AC。2018-11-26 21:46
//自认为,此次编写,是多次编写该题代码,最好的一次。
#include <stdio.h>
#include <string.h>
char a[20],b[1000100];
void toLower(char *s,int len){
int i;
for(i=0;i<len;i++)
if('A'<=s[i]&&s[i]<='Z')
s[i]=s[i]-'A'+'a';
}
int main(){
int len_a,len_b,i,j,k,cnt=0,pos;
gets(a+1);
len_a=strlen(a+1);
a[0]=' ',a[len_a+1]=' ',a[len_a+1+1]='\0';
len_a=strlen(a),toLower(a,len_a);
gets(b+1);
len_b=strlen(b+1);
b[0]=' ',b[len_b+1]=' ',b[len_b+1+1]='\0';
len_b=strlen(b),toLower(b,len_b);
for(i=0;i<len_b;i++){
k=0;
while(k<len_a&&b[i+k]==a[k])k++;
if(k==len_a){
cnt++;
if(cnt==1)pos=i;
}
}
if(cnt>0)printf("%d %d\n",cnt,pos);
else printf("-1\n");
}
2019-1-11 21:59 AC 该周内容。