P6785 「EZEC-3」排列
题目描述
pigstd 有一堆数,他想在这么多数中选出若干个数排成一列,记为 x1,x2,⋯ ,xpx_{1},x_{2},\cdots,x_{p}x1,x2,⋯,xp(ppp 为数的个数)。
这一列数合法当且仅当满足以下条件:
- p≥2p \ge 2p≥2。
- 令 yi=xi+1−xiy_{i} = x_{i + 1} - x_{i}yi=xi+1−xi(特别的,yp=x1−xpy_{p}=x_{1}-x_{p}yp=x1−xp),如果把 y1y_{1}y1 到 ypy_{p}yp 按 y1,y2,⋯ ,ypy_1,y_2,\cdots,y_py1,y2,⋯,yp 的顺序排成一圈,那么每两个相邻的数互为相反数且绝对值都为 kkk。
pigstd 想知道,在所有合法的数列中,所有在这个数列中的数之和最大是多少。
输入格式
第一行两个整数 n,kn,kn,k。
接下来 nnn 行,每行两个整数 ai,bia_{i},b_{i}ai,bi,表示 pigstd 有 bib_{i}bi 个 aia_{i}ai。
不保证 aia_{i}ai 互不相同,若有 aia_{i}ai 相同则累加其个数计算。
输出格式
一行一个整数,表示在每一种排列中,所有在这个排列中的数的最大的和。
若没有合法的排列,则只输出 NO\texttt{NO}NO。
输入输出样例 #1
输入 #1
4 3
1 5
2 4
3 3
0 2
输出 #1
6
说明/提示
【样例 1 说明】
当 pigstd 的排列为:0,3,0,30,3,0,30,3,0,3 或 3,0,3,03,0,3,03,0,3,0 时,总和最大,为 666。
【数据规模与约定】
对于 100%100\%100% 的数据,1≤n≤1061 \le n \le 10^61≤n≤106,0≤k,ai≤1060 \le k,a_{i} \le 10^60≤k,ai≤106,1≤bi≤1061 \le b_{i} \le 10^61≤bi≤106。
本题采用捆绑测试。
- Subtask 1(5 points):保证无合法的数列;
- Subtask 2(15 points):k=0k = 0k=0;
- Subtask 3(5 points):n=1n = 1n=1;
- Subtask 4(5 points):n=2n = 2n=2;
- Subtask 5(30 points):n,k,ai,bi≤103n,k,a_i,b_i \le 10^3n,k,ai,bi≤103;
- Subtask 6(40 points):无特殊限制。
C++实现
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int M=1e6+10;
int sum[M*2],n,k,maxn,ans=-1;
signed main()
{
cin>>n>>k;
for (int i=1;i<=n;i++)
{
int a,b;
cin>>a>>b;
sum[a]+=b,maxn=max(maxn,a);
}
if (k==0)
{
for (int i=0;i<=maxn;i++)
if (sum[i]!=1&&sum[i])//注意因为p>=2,所以k=0时sum[i]>=2
ans=max(ans,i*sum[i]);
if (ans==-1)cout<<"NO";
else cout<<ans;
return 0;
}
for (int i=0;i<=maxn;i++)
{
int j=i+k;
if (sum[i]&&sum[j])
ans=max(ans,min(sum[i],sum[j])*(i+j));
}
if (ans==-1)cout<<"NO";
else cout<<ans;
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容