算法竞赛--数组解题

1.开灯问题

描述: 有 n 盏灯,编号为 1~n,第 1 个人把所有灯打开,第 2 个人按下所有编号为 2 的倍数的开关(这些灯将被关掉),第 3 个人按下所有编号为 3 的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有 k 个人,问最后有哪些灯开着?

输入:

输入一组数据:n和k

输出:

输出开着灯的编号

样例输入:

7 3

样例输出:

1 5 6 7

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <string.h>
int light[1005];
int main()
{
int n,k,count=0;
memset(light,0,sizeof(light)); //memset()函数可将数组进行初始化为0或者-1。sizeof()可求整型数组的长度,strlen()可求字符数组的长度。
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=k;j++)
{
if(i%j==0)
light[i]++; //如果是第几个人的倍数,则进行标记计数。
}
}
for(int i=1;i<=n;i++)
{
if(light[i]%2) //如果计数为奇数,则灯开着。
{
if(count==0)
printf("%d",i);
else
printf(" %d",i);
count++;
}
}
printf("\n");
return 0;
}

2.剩下的树

有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点是坐标原点,在每个整数坐标点有一棵树,即在0,1,2,…,L共L+1个位置上有L+1棵树。现在要移走一些树,移走的树的区间用一对数字表示,如 100 200表示移走从100到200之间(包括端点)所有的树。可能有M(1<=M<=100)个区间,区间之间可能有重叠。现在要求移走所有区间的树之后剩下的树的个数。

输入:

两个整数L(1<=L<=10000)和M(1<=M<=100)。接下来有M组整数,每组有一对数字。

输出:

可能有多组输入数据,对于每组输入数据,输出一个数,表示移走所有区间的树之后剩下的树的个数。

样例输入:

1
2
3
4
5
6
7
4 2
1 2
0 2
11 2
1 5
4 7
0 0

样例输出:

2
5

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <string.h>
int tree[10005];
int main()
{
int L,M;
while(scanf("%d %d",&L,&M)&& L||M )
{
memset(tree,0,sizeof(tree));
int count=0;
while(M--)
{
int x,y;
getchar();
scanf("%d %d",&x,&y);
for(int i=x;i<=y;i++)
tree[i]=1; //如果该树在本区间,则进行标记
}
for(int i=0;i<=L;i++)
{
if(tree[i]==0) //如果该树未被标记,该树为剩下的树,再进行计数。
count++;
}
printf("%d\n",count);
}
return 0;
}
小礼物走一个哟
0%