列表

详情


NC13583. 年轮广场

描述

在云塘校区,有一个很适合晒太阳的地方————年轮广场

年轮广场可以看成n个位置顺时针围成一个环。
这天,天气非常好,Mathon带着他的小伙伴们出来晒太阳。他们分别坐在A[i]位置上,每个位置上保证最多只有1个小伙伴。现在Mathon想让大家集合玩狼人杀,所以想选择一个位置集合,之后所有的人顺时针或逆时针移动到那里去,每移动两个相邻的位置需要1个单位时间,小伙伴们都很有素质所以不会插近路踩草坪,只会沿着位置走。
Mathon想越快集合越好,于是他在群里发了QQ消息告诉大家集合位置,假设所有人都立刻接到了消息,然后都以最优的方法往集合位置移动。
要把所有人集合到一个位置最少需要多少时间?

输入描述

多组输入 每组数据第一行输入n,m(1<=n,m<=1000),n表示年轮广场上位置的个数,m表示Mathon以及他的小伙伴总人数 第二行m个数,第i个A[i](1<=A[i]<=n)表示第i个人的位置。

输出描述

每组数据输出一行,表示所需要的最少时间。

示例1

输入:

5 3
1 4 5
3 2
1 3

输出:

1
1

说明:

第一组数据选择5为集合地点,第二组数据选择2为集合地点。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 24ms, 内存消耗: 324K, 提交时间: 2023-03-19 21:41:50

#include<stdio.h>
#include<math.h>
int main(){
	int a,b,c,ans,i,j,n,m,A[1005],t;
	while(scanf("%d%d",&n,&m)!=EOF){
		for(i=0;i<m;i++) scanf("%d",&A[i]);
		for(i=1,ans=n;i<=n;i++){
			for(j=0,t=0;j<m;j++){
				a=abs(A[j]-i);
				b=n-a;
				c=a<b?a:b;
				if(t<c) t=c;
			}
			if(ans>t) ans=t;
		}
		printf("%d\n",ans);
	}
} 

Python3 解法, 执行用时: 1524ms, 内存消耗: 4780K, 提交时间: 2023-04-23 19:43:01

while True:
    try:
        n,m=map(int,input().split())
        lst=list(map(int,input().split()))
        lst.sort()
        mn=n*m
        for i in range(m):
            mn=min(mn,(max(lst)-min(lst))//2+(max(lst)-min(lst))%2)
            lst[i]=lst[i]+n
        print(mn)
    except:
        break

C++(clang++ 11.0.1) 解法, 执行用时: 17ms, 内存消耗: 424K, 提交时间: 2022-08-22 13:34:45

#include <bits/stdc++.h>
using namespace std;
int a[1001];
int main()
{
	int n,m;
	while(cin>>n>>m)
	{
		for(int i=1;i<=m;i++)cin>>a[i];
		sort(a+1,a+m+1);
		int jl=n-(a[m]-a[1])+1;
		for(int i=2;i<=m;i++)
		{
			jl=max(jl,a[i]-a[i-1]+1);
		}
		int t=(n-jl)/2+1;
		cout<<t<<endl;
	}
} 

上一题