第十二届蓝桥杯真题——卡片

问题描述

小蓝有 k 种卡片, 一个班有 n 位同学, 小蓝给每位同学发了两张卡片, 一 位同学的两张卡片可能是同一种, 也可能是不同种, 两张卡片没有顺序。没有 两位同学的卡片都是一样的。

给定 n, 请问小蓝的卡片至少有多少种?

输入格式

输入一行包含一个正整数表示 n 。

输出格式

输出一行包含一个整数, 表示答案。

样例输入


6

样例输出


3

样例说明

小朋友们手中的卡片可能是: (1,1),(1,2),(1,3),(2,2),(2,3),(3,3) 。

评测用例规模与约定

对于 50 的评测用例, 1≤n≤10^4。

对于所有评测用例, 1≤n≤10^9 。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

问题分析

问题给定我们一个正整数n,表示人数,一个人手里两张有数字的卡片,并且任意两个人手里的卡片不同,没有顺序,即(1,2)与(2,1)是一组。

咱们根据样例的分析

小朋友们手中的卡片可能是: (1,1),(1,2),(1,3),(2,2),(2,3),(3,3)。

可以分析出这道题是给出Sn,让我们求这个n。

但是这样也不准确因为给出的数据有可能在Sn-1与Sn之间

所以我们在求解的时候,要求的是第一个n,使得Sn>=给出的数据

方法一 暴力求解

直接用while,求和就好,只要注意循环条件就ok

#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std;
int main()
{
	int n;
	cin >> n;
	int sum=0,ans=0;
	while (sum < n)
	{
		ans++;
		sum += ans;
	}
	cout << ans;
}

方法二 运用数学公式

运用前n项和的公式Sn=(n+1)*n/2来求

#include <iostream>
#include<math.h>
#include<iomanip>
using namespace std;
int main()
{

    int n, res = 0;
    cin >> n;
    while (1)
    {
        res++;
        if (res * res + res >= 2 * n) break;
    }
    cout << res;
}

然后这道题就完美解决啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值