郑州大学2022-2023第一学期算法设计与分析-实验2(第二章)

1.斐波那契数列(I)

#include<bits/stdc++.h>
using namespace std;
int dfs(int n)
{
	if(n == 1 || n == 2) return 1;
	else return dfs(n - 1) + dfs(n - 2);
} 
signed main()
{
	int n; cin >> n;
	cout << dfs(n) ;
}

2.斐波那契数列(II)

#include<bits/stdc++.h>
using namespace std;
const int mod = 998244353; 
signed main()
{
	int n; cin >> n;
	if(n == 1 || n == 2) 
	{
		cout << 1;
		return 0;
	}
	int a1 = 1, a2 = 1;
	for(int i = 3; i <= n; i ++)
	{
		if(i & 1) a1 = (a1 + a2) % mod;
		else a2 = (a1 + a2) % mod;
	}
	if(n & 1) cout << a1 % mod;
	else cout << a2 % mod;
}

3.斐波那契数列(III)— 矩阵快速幂

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
void matrix_mul(int a[][2])
{
	int tmp[2][2] = {0};
	for(int i = 0; i < 2; i ++)
		for(int j = 0; j < 2; j ++)
			for(int k = 0; k < 2; k ++)
				tmp[i][j] = (tmp[i][j] % mod + a[i][k] * a[k][j]) % mod;
	memcpy(a, tmp, sizeof tmp);
}
void mul(int f[], int a[][2])
{
	int tmp[2] = {0};
	for(int i = 0; i < 2; i ++)
		for(int j = 0; j < 2; j ++)
			tmp[i] = (tmp[i] + f[j] * a[j][i]) % mod;
	memcpy(f, tmp, sizeof tmp);
}
signed main()
{
	int n; cin >> n;
	int f[2] = {0, 1};
	int a[2][2]={
		{1,1},
		{1,0}
	};
	while(n)
	{
		if(n & 1) mul(f, a);
		matrix_mul(a);
		n >>= 1;
	}
	cout << f[0] << '\n';
}

4.分形的递归输出

#include<bits/stdc++.h>
using namespace std;
const int mod = 998244353; 
int qmi(int a,int b){int res=1;a=a%mod;while(b){if(b&1)res=res*a%mod;a=a*a%mod;b>>=1;}return res%mod;}
char g[1010][1010];

void dfs(int x, int y, int n)
{
	if(n == 1)
	{
		g[x][y] = 'X';
		return ;
	}
	int m = qmi(3, n - 2);
	dfs(x, y, n - 1);
	dfs(x, y + 2 * m, n - 1);
	dfs(x + m, y + m, n - 1);
	dfs(x + 2 * m, y, n - 1);
	dfs(x + 2 * m, y + 2 * m, n - 1);
}

int n;
void solve()
{
	
	int m = qmi(3, n - 1);
	for(int i = 1; i <= m; i ++)
		for(int j = 1; j <= m; j ++)
			g[i][j] = ' ';
	dfs(1, 1, n);
	
	for(int i = 1; i <= m; i ++)
	{
		for(int j = 1; j <= m; j ++)
			cout << g[i][j];
		cout << '\n';
	}
	cout << '-' << '\n';
}

signed main()
{
	while(cin >> n, n != - 1) solve();
}

5.子序列的平均值 — 二分 + 贪心

#include<bits/stdc++.h>
using namespace std;
const int N = 100010; 

int n, m;
int a[N];
double s[N];
bool check(double x)
{
	for(int i = 1; i <= n; i ++) s[i] = s[i - 1] + a[i] - x;
	double maxv = -1e9, minv = 1e9;
	for(int i = m; i <= n; i ++)
	{
		minv = min(minv, s[i - m]);
		maxv = max(maxv, s[i] - minv);
	}
	return maxv >= 0;
}


signed main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; i ++) cin >> a[i];
	double l = 0, r = 1e6;
	while(r - l > 1e-6)
	{
		double mid = (l + r) / 2;
		if(check(mid)) l = mid;
		else r = mid;
	}
	cout << (int)(r * 1000) << '\n';
}

6.谁没有完成实验?

#include<bits/stdc++.h>
using namespace std;
unordered_set<int>S;
signed main()
{
	int n, x; cin >> n;
	for(int i = 1; i <= n; i ++)
	{
		cin >> x;
		S.insert(x);
	}
	int q; cin >> q;
	while(q --)
	{
		cin >> x;
		if(S.count(x)) cout << "Yes\n";
		else cout << "No\n"; 
	}
	
}

7.士兵排队 — 贪心 + 数学

#include<bits/stdc++.h>
using namespace std;
const int N = 100010; 
int a[N], b[N];
signed main()
{
	int n; cin >> n;
	for(int i = 0; i < n; i ++) cin >> a[i] >> b[i];
	sort(a, a + n);
	for(int i = 0; i < n; i ++) a[i] -= i;
	int res = 0;
	sort(b, b + n);
	sort(a, a + n);
	for(int i = 0; i < n; i ++)
	{
		res += abs(a[i] - a[n / 2]);
		res += abs(b[i] - b[n / 2]);
	}
	cout << res << '\n';
}

8.输油管道问题 — 贪心

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N], b[N];
signed main()
{
	int n; cin >> n;
	for(int i = 0; i < n; i ++) cin >> a[i] >> b[i];
	
    sort(b, b + n);
    int res = 0;
	for(int i = 0; i < n; i ++)
		res += abs(b[i] - b[n / 2]);
	cout << res << '\n';
	
}
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_WAWA鱼_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值