题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2034
思路:该题比较容易漏掉的是元素不能有重复的数,刚开始没有注意这点,怎么都不能通过掉在这个坑里很久,在对集合输入数据时给他判断一下,如果有重复的就删掉,重新输入,最后输入的次数就是n和m,所以不用因为有重复而多输入一次,然后就是对A和B的集合进行对比,B中如果有A相同的项,则在A中去掉这一项,最后输出没有重复的项
代码为:
#include<stdio.h>
int main()
{
int z, j, g;
int n, m;
int i,a[101], b[101], c[101], t;
while(scanf("%d%d", &n, &m) != EOF)
{
if(m==0 && n==0)
break;
if(n>=0 && n<=100 && m>=0 && m<=100)
{
z = 0;
for(i=0;i<n;i++)
{
scanf("%d", &a[i]);
for(j=0;j<i;j++)
{
if(a[i] == a[j])
{
i--;
n--;
}
}
}
for(i=0;i<m;i++)
{
scanf("%d", &b[i]);
for(j=0;j<i;j++)
{
if(b[i] == b[j])
{
i--;
m--;
}
}
} //这里上面是对A,B元素赋值
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(a[i] == b[j])
{
c[z++] = a[i]; //这里判断出,A,B集合中相同的元素放在c中
break;
}
}
}
if(z == n)
printf("NULL\n"); //如果说A中的所有元素B中都包含,则直接输出NULL
else
{
for(i=0;i<n-1;i++)
{
t = i;
for(j=i+1;j<n;j++)
{
if(a[t]>a[j])
t = j;
}
g = a[i];
a[i] = a[t];
a[t] = g;
} //对A集合整体排序,由小到大
for(i=0;i<n;i++)
{
for(j=0;j<z;j++)
{
if(a[i] == c[j])
{
break;
}
}
if(j==z)
{
printf("%d ", a[i]);
}
}
printf("\n");
}
}
}
return 0;
}
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2041
思路:超级楼梯问题,只要多做出几组数据就能发现每个数之间的联系
刚开始的时候没有想到数据间的联系,就一头蒙的想各种方法,到后面多写出几组数据的时候就发现了,其实就是简单的递推,a[i] = a[i-1] + a[i-2]
代码:
#include<stdio.h>
int main()
{
int a[42];
int i,n,j,m;
a[0] = 1;
a[1] = 1;
a[2] = 2;
while(scanf("%d", &n) != EOF)
{
for(i=0;i<n;i++)
{
scanf("%d", &m);
if(m>=1 && m<=40)
{
for(j=3;j<m;j++)
{
a[j] = a[j-1] + a[j-2];
}
printf("%d\n", a[m-1]);
}
}
}
return 0;
}