牛客小白月赛102

A-序列中的排列

要求:在一个序列中判断是否存在k的排列

思路:先记录读入的序列中包含哪些数字,再从记录中找1~k是否都存在,只要有一个不存在就说明不存在这个排列

cpp 复制代码
int n,k;

void solve()
{
	cin >> n >> k;
	vector<int> v;
	map<int,int> mp;
	
	for (int i = 1;i <= n;i ++) 
	{
		int x; cin >> x;
		v.pb(x);
		mp[x] ++;
	}
	
	for (int i = 1;i <= k;i ++)
	{
		if (mp[i] == 0) 
		{
			cout << "NO" << endl;
			return ;
		}
	}
	
	cout << "YES" << endl;
}

B-连分数

考察极限的相关东西??

思路:由题意可知 n趋向正无穷时f(n) = x,那么f(n - 1)也可以为x ,依照题意可得 x = a + 1 / x ===> x^2 - ax - 1 = 0;再由求根公式就可以计算出x的值

cpp 复制代码
double a;

void solve()
{
	cin >> a;
	double x = (a + sqrt(a * a + 4)) / 2;
	cout << fixed << setprecision(15) << x << endl;
}

C-sum

思路:

若数组之和小于 sum ,则将最小的数变成最大(1e4),直到数组之和大于 sum,如果可以实现跨越则说明0~1e4中存在一个数可以使得数组之和满足要求

若数组之和大于 sum ,则将最大的数变成最小(-1e4),直到数组之和小于 sum,如果可以实现跨越则说明-1e4~0中存在一个数可以使得数组之和满足要求

cpp 复制代码
const int N = 2e5 + 9; 

int n,m;
int a[N];

void solve()
{
	cin >> n >> m;
	LL sum = 0;
	LL ans = 0;
	for (int i = 1;i <= n;i ++) cin >> a[i],sum += a[i];
	
	sort(a + 1,a + n + 1);
	
	if (sum == m) cout << 0 << endl;
	else if (sum > m)
	{
		for (int i = n;i >= 1;i --)
		{
			sum -= (a[i] + 1e4);
			ans ++;
			if (sum <= m) 
			{
				cout << ans << endl;
				return;
			}
		}
	}
	else 
	{
		for (int i = 1;i <= n;i ++)
		{
			sum += (1e4 - a[i]);
			ans ++;
			if (sum >= m) 
			{
				cout << ans << endl;
				return;
			}
		}
	}
	

	
}
相关推荐
程芯带你刷C语言简单算法题21 小时前
Day28~实现strlen、strcpy、strncpy、strcat、strncat
c语言·c++·算法·c
踏浪无痕21 小时前
周末拆解:QLExpress 如何做到不编译就能执行?
后端·算法·架构
一个不知名程序员www21 小时前
算法学习入门--- 树(C++)
c++·算法
如竟没有火炬1 天前
四数相加贰——哈希表
数据结构·python·算法·leetcode·散列表
背心2块钱包邮1 天前
第9节——部分分式积分(Partial Fraction Decomposition)
人工智能·python·算法·机器学习·matplotlib
Simon席玉1 天前
C++的命名重整
开发语言·c++·华为·harmonyos·arkts
仰泳的熊猫1 天前
1148 Werewolf - Simple Version
数据结构·c++·算法·pat考试
chao1898441 天前
MATLAB中的多重网格算法与计算流体动力学
开发语言·算法·matlab
大工mike1 天前
代码随想录算法训练营第四十四天 | 99.岛屿数量 深搜 99.岛屿数量 广搜 100. 岛屿的最大面积
算法
十五年专注C++开发1 天前
同一线程有两个boost::asio::io_context可以吗?
c++·boost·asio·异步编程·io_context