web考核题解

1.P1035 [NOIP2002 普及组] 级数求和

分析:

  我们通过阅读题目可以发现,题设给的是一个有规律性的数列,我们读完第一句话就可以使用一个for循环将Sn的通式给求出来。

        然后就去看后面的题目要求,题目说对于任意k,当n足够大时候,数列的和大于我们的整数,这时去求下角标的大小。

        这里我们需要去捋清三个量之间的关系——

                k是作为我们主动结束循环的最终值

                n是一个递增的数列

                Sn的大小则决定了我们循环的判断

        由此可见,我们用k去与Sn进行动态比对,然后当满足条件后结束我们的循环输出n。这就是本题的关键。

#include<stdio.h>
main()
{
   int n;
   int k;
   double m=1;
   scanf("%d",&k);
   double sum=0;
for(n=1;sum<=k;n++){
	sum+=m/n;
}
printf("%d",n-1);
}

 2.P1014 [NOIP1999 普及组] Cantor 表

题目描述 Description

现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 2/3 2/4 … 3/1 3/2 3/3 … 4/1 4/2 … 5/1 … … 我们以Z字形给上表的每一项编号。第一项是1/1,然后是1/2,2/1,3/1,2/2,…

样例输入

7

样例输出

1/4

思路理解:

1.整体思路是先找出在第几斜行,然后找出在该行的第几个元素位置上

 2.关于找准位置:
    i表示的是斜行,最左上角为第一斜行,n为输入的数字 
    比较i和n的关系, 
    等到n小于i的时候,表示这个元素在第i斜行里,
    (因为前面每一次比较时,n都是减去了第i行的i个元素,
    也就是说,等到n小于i的时候就是n被定位到了i斜行里)

 3.找到位置之后要注意,奇数行是左下往右上走,偶数行相反, 
     因此 奇数行输出为n和i+1-n,
     偶数行反过来,为 i+1-n和n
 

#include <stdio.h>
int main()
{
	int n, i;
	scanf("%d", &n);
	for (i = 1; n - i > 0; i++)
	{
		n -= i;
	}
	if (i % 2 == 0)
		printf("%d/%d", n, i + 1 - n);
	else
		printf("%d/%d", i + 1 - n, n);
	return 0;
}

3.P6565 [NOI Online #3 入门组] 最急救助

题目描述
救助中心每天都要收到很多求救信号。收到求救信号后,救助中心会分析求救信号,找出最紧急的求救者给予救助。

求救信号是一个由小写英文字母组成的字符串,字符串中连续三个字符依次组成sos的情况越多(即包含子串sos的数目越多),代表着求救者情况越紧急。

现在请你帮助救助中心找出最紧急的求救者。注意字符串中包含的sos可以有重叠,例如sosos算作包含 2 22 个sos。

输入格式
从标准输入读入数据。

第一行一个整数 n nn,表示求救者的数目。

接下来有 2 × n 2\times n2×n 行,每行一个由小写英文字母组成的字符串。这 2 × n 2\times n2×n 行中,第 2 × i − 1 2\times i-12×i−1(1 ≤ i ≤ n 1\le i\le n1≤i≤n)行的字符串表示第 i ii 个求救者的名字,第 2 × i 2\times i2×i 行的字符串表示第 i ii 个求救者的求救信号。

输出格式
输出到标准输出。

输出共两行,第一行是最紧急求救者的名字。如果最紧急求救者有多个,则按照输入的顺序将他们的名字依次输出,相邻两个名字间用空格分隔。

第二行一个整数,表示最紧急求救者的求救信号中包含有多少个sos子串。
 

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>

int max(int x,int y)
{
	return (x>y)?x:y; 
} 
struct 
{
	char name[30];//求救者名字 
	char ql[220];//求救信号长度
	int qm;//这个人的求救信号长度 
	int lgh;//这个人的求救信号中含有几个'sos' 
}a[110];

int N;
int main()
{
	//freopen("save.in","r",stdin);
	//freopen("save.out","w",stdout);
	scanf("%d%d",&N);
	int i,j,t;
	t=0;
	for(i=1;i<=N;i++)//读入数据 
	{
		scanf("%s",a[i].name);
		scanf("%s",a[i].ql);
		a[i].qm=strlen(a[i].ql);
		a[i].lgh=0;
	} 
	for(i=1;i<=N;i++) 
	{
		for(j=2;j<=a[i].qm;j++)
		{
			if(a[i].ql[j]=='s'&&a[i].ql[j-1]=='o'&&a[i].ql[j-2]=='s')
			{
				a[i].lgh++;
			}
		}
	} 
	for(i=1;i<=N;i++)
	{
		t=max(a[i].lgh,t);
	}
	for(i=1;i<=N;i++)
	{
		if(a[i].lgh==t)
		{
			printf("%s ",a[i].name);
		}
	}
	printf("\n%d\n",t);
}

4.P1161 开灯

题目描述

在一条无限长的路上,有一排无限长的路灯,编号为 1,2,3,4,…1,2,3,4,…。

每一盏灯只有两种可能的状态,开或者关。如果按一下某一盏灯的开关,那么这盏灯的状态将发生改变。如果原来是开,将变成关。如果原来是关,将变成开。

在刚开始的时候,所有的灯都是关的。小明每次可以进行如下的操作:

指定两个数,�,�a,t(�a 为实数,�t 为正整数)。将编号为 ⌊�⌋,⌊2×�⌋,⌊3×�⌋,…,⌊�×�⌋⌊a⌋,⌊2×a⌋,⌊3×a⌋,…,⌊t×a⌋ 的灯的开关各按一次。其中 ⌊�⌋⌊k⌋ 表示实数 �k 的整数部分。

在小明进行了 �n 次操作后,小明突然发现,这个时候只有一盏灯是开的,小明很想知道这盏灯的编号,可是这盏灯离小明太远了,小明看不清编号是多少。

幸好,小明还记得之前的 �n 次操作。于是小明找到了你,你能帮他计算出这盏开着的灯的编号吗?

#include<stdio.h>
#include<math.h>
int main() {
	int N,t,i;
	double a;
	int b[1000000] = {0,};
	scanf("%d",&N);
	for(i = 1; i <= N; i++) {
		scanf("%lf %d",&a,&t);
		for(int j = 1; j <= t; j++) {
			int temp = floor(a*j);
			if(b[temp] == 0) {
				b[temp] = 1;
			} else if(b[temp] == 1) {
				b[temp] = 0;
			}
		}
	}
	for(i=0;;i++) {
		if(b[i] == 1) {
			break;
		}
	}
	printf("%d",i);
}

5.最后一道题太难,做不出来,所以不写了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值