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("\n");
60 
61        printf("%d\n",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\n",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\n",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\n",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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值