从昨天开始就进入了一天一考的可怕时间。
还有17天就考试了啊。
CCF全国信息学奥林匹克联赛
(NOIP2016)
复赛模拟提高组 day2 解题报告
1. Sequence
Limits
Time: 1000ms per test case
Memory: 131072KiB
Java class name: Main
Judge mode: Normal
怎么说呢,是一个大水题,标算是一个贪心,我也写的贪心,但我只有10分啊233333333。
好像也有30分算法
- 【30分算法】
暴力暴力,枚举每个排列。
- 【满分算法一】
贪心
有两种情况。
我们将这一列数排序,从小到大依次为a1、a2、a3、……an。
则有以下两种最大值情况
1)…… a(n-3) a(n-1) a1 an a2 a(n-2) a(n-4) ……
2)…… a(n-2) a2 an a1 a(n-1) a3 ……
【核心代码】
int cal()
{
int p=n/2+1,ans=0;
b[p]=a[n];
for(int i=p-1;i>=1;i-=2) b[i]=a[p-i];
for(int i=p-2;i>=1;i-=2) b[i]=a[n-(p-i-1)];
for(int i=p+1;i<=n;i+=2) b[i]=a[i-p+1];
for(int i=p+2;i<=n;i+=2) b[i]=a[n-(i-p)];
for(int i=2;i<=n;i++)
ans+=abs(b[i]-b[i-1]);
return ans;
}
int main()
{
int t;
cin>>t;
for (int tt=1;tt<=t;tt++)
{
cin>>n;
for (int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
int ans=0,ret=0;
ans=cal();
for (int i=1;i<=n/2;i++) swap(a[i],a[n-i+1]);
ret=cal();
cout<<"Case "<<tt<<": "<<max(ans,ret)<<endl;
}
return 0;
}
【满分算分二】
来自廖弘毅的神奇最小生成树算法。
【代码】
#include<bits/stdc++.h>
using namespace std;
int n;
int num[60];
int fa[60];
int use[60];
struct EDGE {
int a,b,c;
EDGE(int _a=0,int_b=0,int_c=0):a(_a),b(_b),c(_c) {
}
bool operator>(const EDGE& e) const{
return c>e.c;
}
}Edge[4000];
int getf(int i) {
return