[Codeforces] Global Round 5 A C1 C2 D

本文分享了算法竞赛中的编程技巧,包括使用Python进行取整运算、三维空间中点对的删除顺序算法,以及如何解决BalancedPlaylist问题。通过具体代码示例,详细解析了算法思路与实现细节。

A题意:使得全部数初二上取整或下取整加和后

用python取整输出就行

import math
 
n = int(input())
 
cnt = 0
 
while n :
 
    x = int(input())
 
    if x & 1:
        if cnt & 1:
            print( math.floor(x / 2) )
        else:
            print( math.ceil(x / 2) )
        cnt = cnt + 1
    else:
        print(x // 2)
 
 
    n = n - 1

C1 空间存在一堆点 求一个删点顺序使得 每次删的点对中不包含其他点

n方暴力求距离, 最小的距离的点对肯定不包含其他点

然后删除标记即可

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5e6 + 10;
typedef long long ll;
typedef long double ld;
const ll MOD = 1e9 + 7;
const int MX = 1e5 + 7;
 
struct node
{
	ld x, y, z;
}arr[MAXN];
 
struct pdis
{
	int x, y;
	ld dis;
	bool operator < (const pdis b) const 
	{
		return dis < b.dis;
	}
}brr[MAXN];
 
bool used[MAXN] = {0};
 
ld get(int x, int y)
{
	return sqrt((arr[x].x - arr[y].x) * (arr[x].x - arr[y].x) +
		(arr[x].y - arr[y].y) * (arr[x].y - arr[y].y) + 
		(arr[x].z - arr[y].z) * (arr[x].z - arr[y].z)
	);
}
 
int main()
{ 
	//ios::sync_with_stdio(0);
	//cin.tie(0); cout.tie(0);
	//freopen("1.txt", "r", stdin);
	
	int n, p = 0;
	
	cin >> n;
	
	//注意空间
	 
	for(int i = 0; i < n; ++i)
	{
		cin >> arr[i].x >> arr[i].y >> arr[i].z;
	}
	
	for(int i = 0; i < n; ++i)
	{
		for(int j = i + 1; j < n; ++j)
		{
			brr[p++] = pdis{i, j, get(i, j)}; 
		}
	}
	
	sort(brr, brr + p);
	
	for(int i = 0; i < p; ++i)
	{
		if(!used[brr[i].x] && !used[brr[i].y])
		{
			used[brr[i].x] = 1;
			used[brr[i].y] = 1;
			cout << brr[i].x + 1 << ' ' << brr[i].y + 1 << '\n';
		}
	}
 
    return 0;
}

C3 数据范围增加到5e4 n方过不了

从一维考虑,如果按从左到右的顺序删除点对,肯定不想交

从二维考虑,如果把x固定 y就又变成一维了

三维同上, 所以先删x y相同 z不同的点对

删完 x y 就没了 删剩一个就说明成二维了

然后在固定x删y

最后删x

复杂度

3 * n * log(n)

 

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5e6 + 10;
typedef long long ll;
typedef long double ld;
const ll MOD = 1e9 + 7;
const int MX = 1e5 + 7;
 
struct node
{
	int id;
	int x, y, z;
	bool operator < (const node b) const 
	{
		if(x != b.x) return x < b.x;
		if(y != b.y) return y < b.y;
		return z < b.z;
	}
}arr[MAXN];
 
bitset <MAXN> used;
 
int p;
 
void reget()
{
	int len = p;
	p = 0;
	for(int i = 0; i < len; ++i)
	{
		if(!used[arr[i].id])
		{
			arr[p++] = arr[i];
		}
	}
}
 
int main()
{ 
	//ios::sync_with_stdio(0);
	//cin.tie(0); cout.tie(0);
	//freopen("1.txt", "r", stdin);
	
	cin >> p;
	 
	for(int i = 0; i < p; ++i)
	{
		arr[i].id = i + 1;
		cin >> arr[i].x >> arr[i].y >> arr[i].z;
	}
	
	sort(arr, arr + p);
	
	for(int i = 0; i < p - 1; ++i)
	{
		if(used[arr[i].id])
			continue;
			
		if(arr[i].x == arr[i + 1].x && arr[i].y == arr[i + 1].y)
		{
			cout << arr[i].id << ' ' << arr[i + 1].id << '\n';
			used[arr[i].id] = 1; used[arr[i + 1].id] = 1;
		}
	}
	
	reget();
	
	sort(arr, arr + p);
	
	used.reset();
	
	for(int i = 0; i < p - 1; ++i)
	{
		//cout << arr[i].x << ' ' << arr[i].y << ' ' << arr[i].z << '\n';
		if(used[arr[i].id])
			continue;
			
		if(arr[i].x == arr[i + 1].x)
		{
			cout << arr[i].id << ' ' << arr[i + 1].id << '\n';
			used[arr[i].id] = 1; used[arr[i + 1].id] = 1;
		}
	}
	
	reget();
	
	sort(arr, arr + p);
	used.reset();
	
	for(int i = 0; i < p - 1; ++i)
	{
		if(used[arr[i].id])
			continue;
		cout << arr[i].id << ' ' << arr[i + 1].id << '\n';
		used[arr[i].id] = 1; used[arr[i + 1].id] = 1;
	}
	
	
 
    return 0;
}

 

D - Balanced Playlist

题意:从每个位置开始往右走,下一个位置大于当前走过区间的最大值的一半就能走

考虑对于1点假如能走到5 则 2 3 4 都能走到5 状态是可以延续的

那么用mutiset 维护当前点能走到最远的点

当前点走过以后删掉当前点继续按状态往右维护 最后输出即可 注意循环数组要开三倍

/*
    Zeolim - An AC a day keeps the bug away
*/
   
//#pragma GCC optimize(2)
//#pragma GCC ("-W1,--stack=128000000")
#include <bits/stdc++.h>
using namespace std;
#define mp(x, y) make_pair(x, y)
#define fr(x, y, z) for(int x = y; x < z; ++x)
#define pb(x) push_back(x)
#define mem(x, y) memset(x, y, sizeof(x))
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef std::pair <int, int> pii;
typedef std::vector <int> vi;
//typedef __int128 ill;
const ld PI = acos(-1.0);
const ld E = exp(1.0);
const ll INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;
const int MAXN = 2e6 + 10;
 
int n;
 
int arr[MAXN] = {0};
int ans[MAXN] = {0};
 
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    //freopen("1.txt", "r", stdin);
 	
 	cin >> n;
 	
 	int mx = -1, mi = INF;
 	for(int i = 0; i < n; ++i)
 	{
 		cin >> arr[i];
 		mx = max(arr[i], mx);
 		mi = min(arr[i], mi);
	}
	
	if(mx / 2.0 <= ld(mi) )
	{
		for(int i = 0; i < n; ++i)
			cout << "-1 ";
		return 0;
	}
	
	for(int i = n; i < n * 3; ++i)
	{
		arr[i] = arr[i % n];
	}
    
    multiset <int> ST;
    
    int r = 1;
    
    for(int i = 0; i < n; ++i)
    {
    	if(ST.size() == 0)
    		ST.insert(arr[i]), r = i + 1;
    	while(arr[r] >= *(--(ST.end())) / 2.0)
    	{
    		ST.insert(arr[r++]);
		}
		ans[i] = ST.size();
		auto it = ST.lower_bound(arr[i]);
		ST.erase(it);
	}
	
	for(int i = 0; i < n; ++i)
	{ cout << ans[i] << ' '; }
	
    return 0;
}

 

C语言-光伏MPPT算法:电导增量法扰动观察法+自动全局搜索Plecs最大功率跟踪算法仿真内容概要:本文档主要介绍了一种基于C语言实现的光伏最大功率点跟踪(MPPT)算法,结合电导增量法与扰动观察法,并引入自动全局搜索策略,利用Plecs仿真工具对算法进行建模与仿真验证。文档重点阐述了两种经典MPPT算法的原理、优缺点及其在不同光照和温度条件下的动态响应特性,同时提出一种改进的复合控制策略以提升系统在复杂环境下的跟踪精度与稳定性。通过仿真结果对比分析,验证了所提方法在快速性和准确性方面的优势,适用于光伏发电系统的高效能量转换控制。; 适合人群:具备一定C语言编程基础和电力电子知识背景,从事光伏系统开发、嵌入式控制或新能源技术研发的工程师及高校研究人员;工作年限1-3年的初级至中级研发人员尤为适合。; 使用场景及目标:①掌握电导增量法与扰动观察法在实际光伏系统中的实现机制与切换逻辑;②学习如何在Plecs中搭建MPPT控制系统仿真模型;③实现自动全局搜索以避免传统算法陷入局部峰值问题,提升复杂工况下的最大功率追踪效率;④为光伏逆变器或太阳能充电控制器的算法开发提供技术参考与实现范例。; 阅读建议:建议读者结合文中提供的C语言算法逻辑与Plecs仿真模型同步学习,重点关注算法判断条件、步长调节策略及仿真参数设置。在理解基本原理的基础上,可通过修改光照强度、温度变化曲线等外部扰动因素,进一步测试算法鲁棒性,并尝试将其移植到实际嵌入式平台进行实验验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值