pog loves szh II
Accepts: 97
Submissions: 834
Time Limit: 4000/2000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
pog在与szh玩游戏,首先pog找到了一个包含 n 个数的序列,然后他在这 n 个数中挑出了一个数A,szh出于对pog的爱,在余下的 n−1 个数中也挑了一个数B,那么szh与pog的恩爱值为 (A+B) 对 p 取模后的余数,pog与szh当然想让恩爱值越高越好,并且他们想知道最高的恩爱值是多少。
输入描述
若干组数据(不超过 5 组 n≥1000 )。 每组数据第一行两个整数 n(2≤n≤100000) , p(1≤p≤231−1) 。 接下来一行 n 个整数 ai(0≤ai≤231−1) 。
输出描述
对于每组的每个询问,输出一行,表示pog与szh的最大恩爱值。
输入样例
4 4 1 2 3 0 4 4 0 0 2 2
输出样例
32
#include <bits/stdc++.h> using namespace std; #define maxn 100000 + 10 long long a[maxn]; int n; long long p; void solve() { sort(a+1, a+n+1); // for(int i=1; i<=n; i++) // cout<<a[i]<<" "; // cout<<endl; long long max1=0, max2=0, t1=1, t2=0; if(a[n]+a[n-1] >= p) max2 = a[n]+a[n-1]-p; for(int i=n; i>=1; i--) { if(a[1]+a[i] < p) { t2 = i; //cout<<"t2 : "<<t2<<endl; break; } } if(t2) { for(; t1<t2; ) { max1 = max(max1, a[t1]+a[t2]); //cout<<"max1 : "<<max1<<endl; t1++; while(a[t1]+a[t2] >= p) { t2--; } } } printf("%I64d\n", max(max1, max2)); } int main() { while(~scanf("%d%I64d", &n, &p)) { for(int i=1; i<=n; i++) { scanf("%I64d", &a[i]); a[i] %= p; } solve(); } return 0; } /* 5 6 1 1 1 1 5 5 6 1 1 1 1 4 5 7 1 1 1 1 1 5 7 0 0 0 0 0 */