题意:给出数组a[1~n],(1 ≤ ai ≤ 200 000),从中选取一个数作为第一个数。接下来的所有数都要向下降成它的倍数。求解sum最大是多少。
题解:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
#define de(x) cout << #x << "=" << x << endl
const int N=200005;
int a[N],b[N];
ll sum[N];
int main() {
int n;
while(~scanf("%d",&n)) {
memset(a,0,sizeof(a));
int x;
for(int i=1;i<=n;++i) {
scanf("%d",&x);
++a[x];
}
int m=0;
for(int i=1;i<=200000;++i) {
sum[i]=sum[i-1]+a[i];
if(a[i]) b[++m]=i;
}
ll ans=0;
for(int i=1;i<=m;++i) {
ll tmp=0;
for(int j=1;b[i]*j-1<=200000;++j) {//开头数的j倍
ll t=b[i]*(j+1)-1;
if(t>200000) t=200000;
tmp+=0ll+1ll*b[i]*j*(sum[t]-sum[b[i]*j-1]);
}
ans=max(ans,tmp);
}
printf("%I64d\n",ans);
}
return 0;
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题解:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
#define de(x) cout << #x << "=" << x << endl
const int N=1000000;
int n,k;
int a[N+5];
ll sum[N+5];
bool check(int d) {
if(sum[d-1]) return 0;//有比它更小的数
for(int i=1;d*i<=N;++i) {//这个数的i倍
int t1=d*(i+1)-1;
if(t1>N) t1=N;
int t2=d*i+k;
if(t2>N) t2=N;
if(sum[t1]-sum[t2]>0) return 0;
}
return 1;
}
int main() {
while(~scanf("%d%d",&n,&k)) {
memset(a,0,sizeof(a));
int x;
for(int i=1;i<=n;++i) {
scanf("%d",&x);
++a[x];
}
for(int i=1;i<=N;++i) sum[i]=sum[i-1]+a[i];
for(int i=N;i>=1;--i) {//枚举gcd
if(check(i)) {
printf("%d\n",i);
break;
}
}
}
return 0;
}