问题描述
小蓝有 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;
}
然后这道题就完美解决啦