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分钟做了出来。