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.最后一道题太难,做不出来,所以不写了。