您的位置:首页 > 其它

(奇怪的暴力)codeforces 731F 354C

2016-12-11 09:54 387 查看
731F Video
Cards

题意:给出数组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
,b
;
ll sum
;
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;
}


//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
354C Vasya
and Beautiful Arrays
题意:给出数组a[1~n],(1 ≤ ai ≤ 1000 000),所有数都可以向下降,最多降k。求解最大的gcd。

题解:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: