12/10 C语言程序设计竞赛 后五题

Title(题目)

小朋友顺逆报数

Problem ID(题目编号)

(题目添加成功后由系统自动生成)

Time Limit(运行时间限制)

S(秒)

Memory Limit(内存限制)

MByte(兆)

Description(题目描述):

编号为1,2,…,n的n位小朋友依次排成一列,从1号开始1,2,…,m报数, 凡报到m者出列, 直至报数到队列尾部。此后, 又从队列尾部开始反向1,2,…,m报数, 凡报到m者同样出列。这样反复顺逆报数, 直至队列剩下m-1个小朋友为止。问:最后未出列的m-1位小朋友编号为多少?第p个出列的是哪位小朋友?

Input(输入描述):

输入n,m,p (1<=m<=20, m<=n<=500, 1<=p<=n-m+1)

Output(输出描述):

输出未出列的m-1位小朋友的编号

输出第p位出列的小朋友编号

Sample Input(输入样例):

100,3,50

Sample Output(输出样例):

4 77

25

Test Input(输入测试数据):

480,9,89

Test Output(输出测试数据):

6 49 78 184 265 376 413 475

116

Hint(提示信息):

Source(来源信息):

Code(测试代码):(要求用C语言)

 1 #include<stdio.h>
 2 
 3 int main()
 4 
 5 {
 6 
 7        int ln,x,t,s,i,n,m,p;
 8 
 9        static int a[501];
10 
11        scanf("%d,%d,%d",&n,&m,&p);
12 
13        for(i=1;i<=n;i++) a[i]=1;
14 
15        ln=0;x=0;t=0;
16 
17        while(1)
18 
19        {
20 
21               for(s=0,i=1;i<=n;i++)
22 
23               {
24 
25                      s=s+a[i];
26 
27                      if(s==m) {a[i]=0;s=0;ln++;}
28 
29                      if(ln==p&&x==0) x=i;
30 
31                      if(ln==n-m+1) {t=1;break;}
32 
33               }
34 
35               if(t==1) break;
36 
37               for(s=0,i=n;i>=1;i--)
38 
39               {
40 
41                      s=s+a[i];
42 
43                      if(s==m) {a[i]=0;s=0;ln++;}
44 
45                      if(ln==p&&x==0) x=i;
46 
47                      if(ln==n-m+1) {t=1; break;}
48 
49               }
50 
51               if(t==1) break;
52 
53        }
54 
55        for(i=1;i<=n;i++)
56 
57               if(a[i]!=0) printf("%d ",i);
58 
59        printf("
");
60 
61        printf("%d
",x);
62 
63       
64 
65        return 0;
66 
67 }

Title(题目)

删除中的最值问题

Problem ID(题目编号)

(题目添加成功后由系统自动生成)

Time Limit(运行时间限制)

S(秒)

Memory Limit(内存限制)

MByte(兆)

Description(题目描述):

有一个很大的正整数n(位数不大于100),删除其中的s个数字,余下的数字按原次序组成一个新的正整数m。对给定的n, s, 寻找一种方案,使得组成的新数m最小。

Input(输入描述):

输入n

输入s (s<n的位数)

Output(输出描述):

输出m

Sample Input(输入样例):

83179254297017652

9

Sample Output(输出样例):

12017652

Test Input(输入测试数据):

36271467471259413861475862384788157954123651991367343325

29

Test Output(输出测试数据):

111115754123651991367343325

Hint(提示信息):

Source(来源信息):

Code(测试代码):(要求用C语言)

 1 #include<stdio.h>
 2 
 3 #include<string.h>
 4 
 5 int main()
 6 
 7 {
 8 
 9        int i,t,x,s,k,ln;
10 
11        char a[101];
12 
13        scanf("%s",a);
14 
15        scanf("%d",&s);
16 
17        ln=strlen(a);
18 
19        i=0;t=0;x=0;
20 
21        while(s>x&&t==0)
22 
23        {
24 
25               if(a[i]>a[i+1])
26 
27               {
28 
29                      for(k=i;k<=ln-x-2;k++)
30 
31                             a[k]=a[k+1];
32 
33                      x=x+1;
34 
35                      i=-1;
36 
37               }
38 
39               if(i==ln-x-2) t=1;
40 
41               i++;
42 
43        }
44 
45        for(i=0;i<=ln-s-1;i++)
46 
47               printf("%c",a[i]);
48 
49        return 0;
50 
51 }

Title(题目)

真子串

Problem ID(题目编号)

(题目添加成功后由系统自动生成)

Time Limit(运行时间限制)

S(秒)

Memory Limit(内存限制)

MByte(兆)

Description(题目描述):

真子串是指从原字符串中通过删除某些字符但不破坏余下字符的顺序而形成的新字符串。输入n个字符串,统计出现某个字符串是另一个字符串的真子串的组数。

Input(输入描述):

输入n及n个字符串

Output(输出描述):

真子串数目

Sample Input(输入样例):

3

abc

cxajfkabjfkdc

xjfabkdc

Sample Output(输出样例):

3

Test Input(输入测试数据):

10

fjdakie

jfda;iea;fj

feiw

e

hi

jk

fjieawo;fj;ijfdias

djafsak;ieafa;iewe

hhhh

fjweioa;jf;aii

Test Output(输出测试数据):

15

Hint(提示信息):

Source(来源信息):

Code(测试代码):(要求用C语言)

 1 #include<stdio.h>
 2 
 3 #include<string.h>
 4 
 5 int main()
 6 
 7 {
 8 
 9        int i,j,n,count=0;
10 
11        char seq[100][100];
12 
13        int subseq(char s1[],char s2[]);
14 
15        scanf("%d",&n);
16 
17        getchar();
18 
19        for(i=0;i<n;i++)
20 
21               gets(seq[i]);
22 
23        for(i=0;i<n;i++)
24 
25               for(j=0;j<n;j++)
26 
27                      count+=subseq(seq[i],seq[j]);
28 
29  
30 
31        printf("%d
",count);
32 
33  
34 
35        return 0;
36 
37 }
38 
39  
40 
41 int subseq(char s1[],char s2[])
42 
43 {
44 
45        int m,n;
46 
47        int i,j,s=0;
48 
49        m=strlen(s1);n=strlen(s2);
50 
51        if (m>=n) return 0;
52 
53        for(i=0;i<m;i++)
54 
55               for(j=0;j<n;j++)
56 
57                      if(s1[i]==s2[j])
58 
59                      {
60 
61                             s+=1;
62 
63                             break;
64 
65                      }
66 
67        if(s<m) return 0;
68 
69        else return 1;
70 
71 }

Title(题目)

购票排队

Problem ID(题目编号)

(题目添加成功后由系统自动生成)

Time Limit(运行时间限制)

S(秒)

Memory Limit(内存限制)

MByte(兆)

Description(题目描述):

一场球赛开始之前,售票工作正在紧张的进行中。每张球票为50元。现有m+n个人排队等待购票,其中有m个人手持50元的钞票,另外n个人手持100元的钞票。求出这m+n个人排队购票,使得售票处不至于出现找不开钱的局面的不同排队种数。约定,拿同样面值钞票的人对换位置后为同一种排队。

Input(输入描述):

输入m,n (m<100, n<100)

Output(输出描述):

输出排队种数

Sample Input(输入样例):

15,12

Sample Output(输出样例):

4345965

Test Input(输入测试数据):

20,10

Test Output(输出测试数据):

15737865

Hint(提示信息):

Source(来源信息):

Code(测试代码):(要求用C语言)

 1 #include<stdio.h>
 2 
 3 #include<string.h>
 4 
 5 int main()
 6 
 7 {
 8 
 9        int i,j,m,n;
10 
11        long f[100][100];
12 
13        scanf("%d,%d",&m,&n);
14 
15        for(j=1;j<=m;j++)
16 
17               f[j][0]=1;
18 
19        for(j=0;j<=m;j++)
20 
21               for(i=j+1;i<=n;i++)
22 
23                      f[j][i]=0;
24 
25        for(i=1;i<=n;i++)
26 
27               for(j=i;j<=m;j++)
28 
29                      f[j][i]=f[j-1][i]+f[j][i-1];
30 
31        printf("%ld
",f[m][n]);
32 
33  
34 
35        return 0;
36 
37 }

Title(题目)

序列相似度

Problem ID(题目编号)

(题目添加成功后由系统自动生成)

Time Limit(运行时间限制)

S(秒)

Memory Limit(内存限制)

MByte(兆)

Description(题目描述):

有两条字母序列(区分大小写),计算两者的相似度。这里,相似度定义为两者最长公共子序列的长度与其中较长字母序列的长度之比。例如序列s1=abcbdab和序列 s2=bdcaba的某个最长公共子序列为bcba,且长度为4,而s1的长度为7,s2的长度为6,那么s1和s2的相似度为4/7.

Input(输入描述):

输入数据有多组,每行输入两个字母序列,用空格隔开。每条序列长度不超过100。最后输入“0 0” 表示结束。

Output(输出描述):

输出每组序列的相似度,小数点后保留三位小数。

Sample Input(输入样例):

abc acbt

abcbdab bdcaba

0 0

Sample Output(输出样例):

0.500

0.571

Test Input(输入测试数据):

uefhuahfusdas fhadfhau

eywhfuiafhusdhufhal werujdcfhhh

nvbjhdfncjasdhdbc hjdasluuqwiubfhahlufkjchgsd

jaslhfljhulasdhfulihlasdafhulf fhasdjlhfdshfauefhlu

jhuewuhluihalf djhafjlhjafhjlhfalkh

abcdefghijklmn abcdefghijklmn

dfjaksjkdsalewuihfjasklhu lhfahdjklahfdjfhajskhfjka

uieqwhfuualuiahfusdjlh jladshfjlkashlaks

qwetyyerywquuuquu nnbnzbnvnnnnnzxcnmnmnzxv

jhfadshfjkaslhalj jkdlafshjflajldksalkhaflfhajl

0 0

Test Output(输出测试数据):

0.385

0.316

0.222

0.400

0.350

1.000

0.480

0.318

0.000

0.448

Hint(提示信息):

Source(来源信息):

Code(测试代码):(要求用C语言)

 1 #include<stdio.h>
 2 
 3 #include<string.h>
 4 
 5 int main()
 6 
 7 {
 8 
 9        int i,j,m,n,maxlen;
10 
11        char s[101],t[101];
12 
13        int c[101][101];
14 
15        while(1)
16 
17        {
18 
19               scanf("%s%s",s,t);
20 
21               if(strcmp(s,"0")==0 &&strcmp(t,"0")==0) break;
22 
23               m=strlen(s);n=strlen(t);
24 
25               maxlen=m>n?m:n;
26 
27               for(i=0;i<=m;i++) c[i][n]=0;
28 
29               for(j=0;j<=n;j++) c[m][j]=0;
30 
31               for(i=m-1;i>=0;i--)
32 
33                      for(j=n-1;j>=0;j--)
34 
35                             if(s[i]==t[j])  c[i][j]=c[i+1][j+1]+1;
36 
37                             else if (c[i][j+1]>c[i+1][j]) c[i][j]=c[i][j+1];
38 
39                             else c[i][j]=c[i+1][j];
40 
41               printf("%.3f
",c[0][0]/(float)maxlen);
42 
43  
44 
45        }
46 
47  
48 
49        return 0;
50 
51 }
原文地址:https://www.cnblogs.com/wushuaiyi/p/3470361.html