半月赛补题1.0

文章讲述了几个编程题目的解决思路,包括通过找数字序列的规律简化计算,理解并运用递归解决青蛙跳台阶问题,以及在团队多样性问题中统计不同数据的方法。强调了找到问题模式和有效实现的重要性。
摘要由CSDN通过智能技术生成

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;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值