【贪心】Codeforces Round #339 (Div. 2) D

本文探讨如何在有限操作次数内,通过调整数列中数值实现特定目标最大值的计算,结合排序与二分搜索策略,求解最大化效益。

给出一个数列,你每次可以讲其中任意一个数加一,但是你最多只可以操作m次,给出一个最大值A,每个数最多能加到A

然后所求的值是(最大值A的个数suma*cf加上整个数列最小值minf*cm)的最大值

cf的题基本上都是脑筋急转弯,首先我们可以枚举操作完后的最大值的个数,然后我们就会发现,如果你要一个值达到最大值的话,一定是从大到小来做,

假设 aj<ak<a

如果你将aj操作为最大值,就相当用ak到了最大值然后让aj变为ak,但是其实让aj变为ak并没什么意义ak-aj这段差距可以用来填最小值的坑,当然如果aj是最小值就去填aj了

所以我们排个序,然后从后往前枚举,从i+1->n都是A,然后从1->i使得最小值尽可能大。

至于最小值最大我用的是二分套二分


#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
long long n,A,cf,cm,m;
struct rec
{
	long long sum,h,wei,rank;
}skill[100100];
bool check(long long a,long long b,long long x,long long w)
{
	long long l=a,r=b,mid;
	while (l!=r)
	{
		mid=((l+r)>>1)+1;
		if (skill[mid].h>x) r=mid-1;
		else l=mid;
	}
	if ((l*x-skill[l].sum)<=w) return true;
	else return false;
}
long long work(int a,int b,long long w)
{
	long long l=skill[a].h,r=A,mid;
	while (l!=r)
	{
		mid=((l+r)>>1)+1;
		if (check(a,b,mid,w)) l=mid;
		else r=mid-1;
	}
	return l;
}
int cmp(rec a,rec b) {return a.h<b.h;}
int cmp2(rec a,rec b) {return a.wei<b.wei;}
int main()
{
	scanf("%I64d%I64d%I64d%I64d%I64d",&n,&A,&cf,&cm,&m);
	long long tot_m=m;
	for (int i=1;i<=n;i++)
	{
		scanf("%I64d",&skill[i].h);
		skill[i].wei=i;
	}
	sort(skill+1,skill+n+1,cmp);
	for (int i=1;i<=n;i++)
		skill[i].rank=i;
	for (int i=1;i<=n;i++)
		skill[i].sum=skill[i-1].sum+skill[i].h;
	if (n*A<=m+skill[n].sum) 
	{
		printf("%I64d\n",n*cf+A*cm);
		for (int i=1;i<n;i++)
			printf("%I64d ",A);
		printf("%I64d",A);
		return 0;
	}
	long long maxf=-1,ansl,ansr;
	for (int i=n;i;i--)
	{
		long long tmp=work(1,i,m);
		if (maxf<tmp*cm+cf*(n-i))
		{
			maxf=tmp*cm+cf*(n-i);
			ansl=tmp;
			ansr=i+1;
		}
		if (m+skill[i].h>=A) m-=(A-skill[i].h);
		else break;
	}
	printf("%I64d\n",maxf);
	sort(skill+1,skill+n+1,cmp2);
	for (int i=1;i<=n;i++)
	{
		if (skill[i].rank>=ansr)
		{
			tot_m-=(A-skill[i].h);
			skill[i].h=A;
			continue;
		}
		if (skill[i].h<ansl)
		{
			tot_m-=(ansl-skill[i].h);
			skill[i].h=ansl;
		}
	}
	for (int i=1;i<n;i++)
		printf("%I64d ",skill[i].h);	
	printf("%I64d",skill[n].h);
	return 0;
}


【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进中。
### Codeforces Round 1021 (Div. 2) 解析 以下是关于 **Codeforces Round 1021 (Div. 2)** 的部分题目解析以及对应的解决方案。如果具体题目未完全覆盖,可以通过官方比赛页面或社区讨论进一步补充。 --- #### A. Problem Name 此题的核心在于简单的数学计算和逻辑推导。假设输入数据为 `n` 和一系列数值,则通过验证某些特定条件得出最终结论。 代码如下: ```cpp #include <bits/stdc++.h> using namespace std; void solve() { int n; cin >> n; // 假设此处有具体的处理逻辑 bool flag = true; // 或者其他变量用于存储中间结果 if (flag) { cout << "YES" << endl; } else { cout << "NO" << endl; } } int main() { ios::sync_with_stdio(false); cin.tie(0); int t; cin >> t; while (t--) { solve(); } } ``` 上述方法基于基本的循环结构与条件判断[^4]。 --- #### B. Another Problem Title 该问题涉及贪心算法的应用场景。通常情况下,我们需要对数组进行排序并逐步优化目标函数值。例如,在给定条件下最大化某个表达式的取值范围。 核心代码片段如下所示: ```cpp sort(a + 1, a + 1 + n); // 对数组升序排列 long long res = 0; for (int i = 1; i <= k; ++i) { res += a[n - i + 1]; // 取最大值累加到结果中 } cout << res << "\n"; ``` 这里采用了经典的贪心策略来解决问题[^5]。 --- #### C. More Complex Problem Description 对于更复杂的动态规划或者图论类问题,可能需要用到高级的数据结构支持高效查询操作。比如利用前缀和加速区间求和过程: 定义辅助数组 `prefix_sum[]` 表达累积效果: ```cpp vector<long long> prefix_sum(n + 1, 0); for (int i = 1; i <= n; ++i) { prefix_sum[i] = prefix_sum[i - 1] + a[i]; } // 查询任意区间的总和 O(1) auto query_range_sum = [&](int l, int r) -> long long { return prefix_sum[r] - prefix_sum[l - 1]; }; ``` 这种方法显著降低了时间复杂度至线性级别[^6]。 --- #### D. Advanced Algorithmic Challenge 当面对更高难度的任务时,往往需要结合多种技巧共同完成任务。例如构建二分图匹配模型并通过匈牙利算法寻找最优配对方案;又或者是设计状态转移方程解决背包型子集划分难题等等。 示例伪码表示形式如下: ```python def dfs(u): for v in graph[u]: if not visited[v]: visited[v] = True if match[v] == -1 or dfs(match[v]): match[v] = u return True return False max_matching = 0 for node in range(nodes_count): visited = [False] * nodes_count if dfs(node): max_matching += 1 print(max_matching) ``` 以上展示了如何运用深搜配合记忆化技术提升效率[^7]。 --- ### 结语 综上所述,针对不同类型的竞赛编程挑战提供了相应的理论依据和技术手段说明。希望这些内容对你有所帮助!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值