AtCoder Beginner Contest 173 D Chat in a Circle 画图找规律(数组的递推规律)

AtCoder Beginner Contest 173   比赛人数10755  比赛开始后6分钟看到所有题

AtCoder Beginner Contest 173   D   Chat in a Circle    画图找规律(数组的递推规律)

总目录详见https://blog.csdn.net/mrcrack/article/details/104454762

在线测评地址https://atcoder.jp/contests/abc173/tasks/abc173_d

题目大意:在圆形操场中一个一个的安排人员,安放人员的顺序,位置由编程者决定,若该人员有左右邻居,找出友好度最低的邻居值,进行求和,安置好所有人员后,要求和值最大,请输出这个和值。

造了一组数据进行研究

Input:
10
10 9 8 7 6 5 4 3 2 1

Output:
70

上述数据生成过程如下:

 针对上述数据生成过程,进行规律查找:

插入顺序1  2  3 4 5 6 7 8 9 10
插入数值10 9  8 7 6 5 4 3 2 1
答案影响0  10 9 9 8 8 7 7 6 6

找到规律:
插入顺序1,ans+=0
插入顺序2,ans+=10,请注意a[1]=10
插入顺序3,ans+=9,请注意a[2]=9,a[(3+1)/2]=a[2]
插入顺序4,ans+=9,请注意a[2]=9,a[(4+1)/2]=a[2]
插入顺序5,ans+=8,请注意a[3]=8,a[(5+1)/2]=a[3]
插入顺序6,ans+=8,请注意a[3]=8,a[(6+1)/2]=a[3]
插入顺序7,ans+=7,请注意a[4]=7,a[(7+1)/2]=a[4]
插入顺序8,ans+=7,请注意a[4]=7,a[(8+1)/2]=a[4]
插入顺序9,ans+=6,请注意a[5]=6,a[(9+1)/2]=a[5]
插入顺序10,ans+=6,请注意a[5]=6,a[(10+1)/2]=a[5]

最后ans=70

 根据上述算法编写的AC代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL long long
#define maxn 200010
using namespace std;
LL ans;
int a[maxn];
int cmp(int a,int b){
	return a>b;
}
int main(){
	int n,i;
	scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%d",&a[i]);
	sort(a+1,a+1+n,cmp);
	ans+=a[1];
	for(i=3;i<=n;i++)
		ans+=a[(i+1)/2];
	printf("%lld\n",ans);
	return 0;
}

编后感,一度做不出,咬了几次牙,还是在比赛结束前12分钟做了出来。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值