洛谷P2381 圆圆舞蹈

P2381 圆圆舞蹈

题目描述

熊大妈的乃修在时针的带领下,围成了一个圆圈舞蹈,由于没有严格的教育,奶牛们之间的间隔不一致。

奶牛想知道两只最远的奶牛到底隔了多远。奶牛A到B的距离为A顺时针走和逆时针走,到达B的较短路程。告诉你相邻两个奶牛件的距离,请你告诉奶牛两只最远的奶牛到底隔了多远。

输入输出格式

输入格式:

第一行一个整数N,表示有N只奶牛。(2<=N<=100000)

接下2-N+1行,第i行有一个数,表示第i-1头奶牛顺时针到第i头奶牛的距离。(1<=距离<=maxlingint,距离和<=maxlongint)

第N+1行的数表示第N头奶牛顺时针到第1头奶牛的距离。

输出格式:

一行,表示最大距离。

输入输出样例

输入样例#1:
Crile.in
5
1
2
3
4
5
输出样例#1:
Crile.out
7


Solution 做法1:
记录前缀和,可知前缀和是递增的,枚举起点,我们不难二分一个"中点"
中点左边的点距离小于半个周长,右边的点距离大于半个周长,然后用终点顺、逆时针距离最小值更新答案即可。
复杂度O(nlogn)

做法2:
记录前缀和sum,总长度Len
于是从第一头奶牛开始,找到l,r两只牛,l <= r 这里从1开始
不难发现当距离小于总长度一半的时候,我们需要去找l, r + 1
当距离大于总长度一半的时候,我们需要去找l + 1, r 一定优于l + 1, r + 1

这样省去了很多无用的l,r
乱搞一下就可以了
复杂度O(n)

Code
第二种做法

#include <bits/stdc++.h>

const int MAXN = 100000 + 10;

inline void read(int &x){x = 0;char ch = getchar();char c = ch;while(ch > '9' || ch < '0')c = ch, ch = getchar();while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();if(c == '-')x = -x;}
inline void swap(int &a, int &b){int tmp = a;a = b;b = tmp;}
inline int min(int a,int b){return a > b ? b : a;}
inline int max(int a,int b){return a > b ? a : b;}

int n;
int sum[MAXN],num[MAXN],len;
int ans;
int main()
{
	read(n); 
	for(int i = 2;i <= n;i ++)
	{
		read(num[i]);
		sum[i] = sum[i - 1] + num[i];
		len += num[i];
	}
	read(num[1]);len += num[1];sum[n + 1] = sum[n] + num[1];
	int l = 1, r = 1;int mid = len >> 1;
	while(l <= n + 1 && r <= n + 1)
	{
		if(l == r)
		{
			r ++;
		}
		else if(sum[r] - sum[l] <= mid)
		{
			ans = max(ans, sum[r] - sum[l]);
			r ++;
		}
		else if(sum[r] - sum[l] > mid)
		{
			ans = max(ans, min(sum[r] - sum[l], mid - sum[r] + sum[l]));
			l ++;
		}
	}
	printf("%d", ans);
    return 0;
}

 

第一种做法
#include <bits/stdc++.h>

const int MAXN = 300000 + 10;

inline void read(int &x){x = 0;char ch = getchar();char c = ch;while(ch > '9' || ch < '0')c = ch, ch = getchar();while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();if(c == '-')x = -x;}
inline void swap(int &a, int &b){int tmp = a;a = b;b = tmp;}
inline int min(int a,int b){return a > b ? b : a;}
inline int max(int a,int b){return a > b ? a : b;}

int n;
int sum[MAXN >> 1],len;
int ans;

inline int erfen(int l, int r, int p)
{
	int mid = l + (r - l);
	while(l < r)
	{
		mid = l + ((r - l) >> 1);
		if(p <= sum[mid])r = mid;
		else l = mid + 1;
	}
	return l;
}

//枚举起始点i,二分找j,令s[j] - s[i] <= s / 2  这样j 和 j-1  两个点二选一
//处理环就多复制一层    
int main()
{
	read(n); 
	for(int i = 1;i <= n;i ++)
	{
		read(sum[i]);
		len += sum[i];
		sum[i] += sum[i - 1];
	}
	for(int i = 1;i <= n;i ++)
	{
		 sum[i + n] = len + sum[i];
	}
	for(int i = 1;i <= 2 * n;i ++)
	{
		int tmp = erfen(1, 2 * n, sum[i] + (len >> 1));
		ans = max(ans, min(sum[tmp] - sum[i], len - sum[tmp] + sum[i]));
		ans = max(ans, sum[tmp - 1] - sum[i]) ;
	}
	printf("%d", ans);
    return 0;
}

 






转载于:https://www.cnblogs.com/huibixiaoxing/p/7007532.html

内容概要:该论文聚焦于T2WI核磁共振图像超分辨率问题,提出了一种利用T1WI模态作为辅助信息的跨模态解决方案。其主要贡献包括:提出基于高频信息约束的网络框架,通过主干特征提取分支和高频结构先验建模分支结合Transformer模块和注意力机制有效重建高频细节;设计渐进式特征匹配融合框架,采用多阶段相似特征匹配算法提高匹配鲁棒性;引入模型量化技术降低推理资源需求。实验结果表明,该方法不仅提高了超分辨率性能,还保持了图像质量。 适合人群:从事医学图像处理、计算机视觉领域的研究人员和工程师,尤其是对核磁共振图像超分辨率感兴趣的学者和技术开发者。 使用场景及目标:①适用于需要提升T2WI核磁共振图像分辨率的应用场景;②目标是通过跨模态信息融合提高图像质量,解决传统单模态方法难以克服的高频细节丢失问题;③为临床诊断提供更高质量的影像资料,帮助医生更准确地识别病灶。 其他说明:论文不仅提供了详细的网络架构设计与实现代码,还深入探讨了跨模态噪声的本质、高频信息约束的实现方式以及渐进式特征匹配的具体过程。此外,作者还对模型进行了量化处理,使得该方法可以在资源受限环境下高效运行。阅读时应重点关注论文中提到的技术创新点及其背后的原理,理解如何通过跨模态信息融合提升图像重建效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值