B
Input
4
3
6
8
10
Output
2
5
7
9
这题主要看后面的例子的翻译就好了
这题,我在比赛的时候想复杂了,以为真的要求出前面后边的阶乘,所以就超时了。到后面补题的时候才发现,原来它这么简单...它是要找规律的,就拿上面它剖析的例子来分析
在第一个测试用例中,2*1+1*1=1*(2+1)=1*3=3
(3乘以任意一个不为0的数,结果必定为它本身的倍数)
*在第二个测试用例中,7*6*5*4*3*2*1+6*5*4*3*2*1=(6*5*4*3*2*1)*(7+1)=8*(6*5*4*3*2*1)=5760
(8乘以任意一个不为0的数,结果必定为它本身的倍数)
通过上面的分析,我们可以看出,每一个这样的测试数据都是必然成立的。
代码如下
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int t;
scanf("%d",&t);
printf("%d\n",t-1);
}
}
简单吧,这真的很好的说明了,找到规律有多么的重要。
C
这个题都没做出来,真的就很罪孽。以前写过的一道题啊...
OK,大概是递归没有理解透,过段时间会写一个递归的专题练习的。
直接上代码吧
#include <stdio.h>
int frog(int n)
{
if (n == 1)
return 1;
if (n == 2)
return 2;
return frog(n - 1) + frog(n - 2);
}
int main() {
int n;
while (scanf("%d", &n) != EOF) //这里是输出多组数据
{
printf("%d\n", frog(n));
}
return 0;
}
D-Diverse Team
Input
5 3
15 13 15 15 12
Output
YES
1 2 5
这个题呢,遇到两次了,第一次没有思路,然后也没有再去想,这是第二次遇到了,我有思路,但是呢,实现不出来...so...我的实现能力还是太差了。
题目主要是,想让我们在它给出的数据中看不同数据的个数有几个,是否满足题中所给的k(只能大于或等于k),满足则可以组成这样的团队,输出 "YES" 以及他们的位置,不满足则直接输出 "NO" 。
思路大概是,先定义一个数组a[N]来记录不同数据出现的情况(下标为输入的评分,元素为它们各自对应的第一次出现的位置),再对a[N]进行操作,定义一个 d 来记录共有多少种不同的数据,最后再与 k 进行比较。
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 121;
int a[N];//全局变量默认初始化为0
int main()
{
int n,k,x,d=0;
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>x;
if(!a[x])//如果还是0,则说明还未被记录,第一次出现
{
a[x]=i+1;//记录第一次出现的位置,以及不同的数据
d++;//记录有多少种不同的数据
}
}
cout<<d<<endl;
if(d<k)
cout<<"NO"<<endl;
else
{
cout<<"YES"<<endl;
for(int i=0;i<=100;i++)
{
if(a[i])//a[i]不为0,说明数组有存过这个数据
{
if(k)//k不为零时输出,可以一定程度上降低时间复杂度
cout<<a[i]<<" ";
else
break;
k--;
}
}
cout<<endl;
}
}