CSUACM月赛1971
2017-07-29 21:20
281 查看
看到感觉就是最大和最小匹配挺符合人类思维的就写了。然而题解证明很强。
这个问题是经典的贪心。$ ans
= (a_i - b_j)^2 ,我们展开它得到 ans
= a_i^2 + b_i^2$ - ***2 * ∑ai*bj。前两部分都是固定的,所以要使得答案尽量大,我们应该使得∑ai * bj尽量小。可以猜想这么个结论:a中最大的和b中最小的匹配,a中次大的与b中次小的匹配……这种匹配是最优的。证明使用排序不等式。倒序>=乱序>=顺序
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxl 100010
using namespace std;
int n,ans;
int a[maxl],b[maxl];
bool cmp(const int &x,const int &y)
{
return x>y;
}
void prework()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
sort(a+1,a+1+n,cmp);
sort(b+1,b+1+n,cmp);
}
void mainwork()
{
ans=0;
int l1=1,l2=1,r1=n,r2=n;
for(int i=1;i<=n;i++)
{
if((a[l1]-b[r2])*(a[l1]-b[r2])>(a[r1]-b[l2])*(a[r1]-b[l2]))
{
ans+=(a[l1]-b[r2])*(a[l1]-b[r2]);
l1++;r2--;
}
else
{
ans+=(a[r1]-b[l2])*(a[r1]-b[l2]);
l2++;r1--;
}
}
}
void print()
{
printf("%d\n",ans);
}
int main()
{
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}
这个问题是经典的贪心。$ ans
= (a_i - b_j)^2 ,我们展开它得到 ans
= a_i^2 + b_i^2$ - ***2 * ∑ai*bj。前两部分都是固定的,所以要使得答案尽量大,我们应该使得∑ai * bj尽量小。可以猜想这么个结论:a中最大的和b中最小的匹配,a中次大的与b中次小的匹配……这种匹配是最优的。证明使用排序不等式。倒序>=乱序>=顺序
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxl 100010
using namespace std;
int n,ans;
int a[maxl],b[maxl];
bool cmp(const int &x,const int &y)
{
return x>y;
}
void prework()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
sort(a+1,a+1+n,cmp);
sort(b+1,b+1+n,cmp);
}
void mainwork()
{
ans=0;
int l1=1,l2=1,r1=n,r2=n;
for(int i=1;i<=n;i++)
{
if((a[l1]-b[r2])*(a[l1]-b[r2])>(a[r1]-b[l2])*(a[r1]-b[l2]))
{
ans+=(a[l1]-b[r2])*(a[l1]-b[r2]);
l1++;r2--;
}
else
{
ans+=(a[r1]-b[l2])*(a[r1]-b[l2]);
l2++;r1--;
}
}
}
void print()
{
printf("%d\n",ans);
}
int main()
{
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}
相关文章推荐
- CSUACM月赛1972
- CSUACM月赛 1970
- CSUOJ 1226: ACM小组的内战
- CSU 1839: Who Feels Lucky(ACM-ICPC Asia Thailand National On-Site Programming Contest 2015)
- CSU 1325: A very hard problem 中南月赛的一道题。
- (CSU - 1224)ACM小组的古怪象棋
- csu 10月 月赛 F 题 ZZY and his little friends
- ACM--字符串--CSU--1550-- Simple String
- ACM--酷酷的单词--CSU 1505--湖南第十届省赛
- CSU-ACM 1004: Xi and Bo
- CSU 1838: Water Pump(ACM-ICPC Asia Thailand National On-Site Programming Contest 2015)
- CSU5月月赛
- CSU(ACM入门)1340 A Sample Problem 1341 String and Arrays 1342 Double 1343 Long Long 1344 Special Judge
- CSU--------2133: 中南大学2017年ACM暑期集训前期训练题集(基础题)
- csu-acm 1503: 点到圆弧的距离
- CSU-ACM暑假集训基础组训练赛(5-1) C - Problem C
- ACM学习历程—CSU 1216 异或最大值(xor && 贪心 && 字典树)
- acm湖南第七届省赛 RMQ with Shifts (线段树) csu 1110
- [ACM湖南省赛] CSU 1806 动态最短路的积分
- CSU-ACM2017暑期训练6-bfs H - ACM小组的古怪象棋 CSU - 1224