重走长征路---OI每周刷题记录---9月21日 2013 AC 17题

总目录详见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 该周内容。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值