BZOJ2257: [Jsoi2009]瓶子和燃料
阿新 • • 發佈:2018-04-20
span zoj include algorithm AC IT 約數 true name
題目大意:
有n個數,選擇k個數,最大化這些數通過加減能得到的最小的正整數。
題解:
這些數通過加減能得到的最小的數為他們的最大公約數。
題目要求n個數字中選擇k個使得他們的最大公約數最大。
枚舉所有約數,找出最大的且出現次數大於k的約數。
代碼:
#include<cstdio> #include<algorithm> #include<cmath> using namespace std; int cnt,a[1000005]; void find(int x){ for (int i=1; i<=sqrt(x); i++) if (x%i==0){ a[++cnt]=i; if (i!=x/i) a[++cnt]=x/i; } } int main(){ int n,k; scanf("%d%d",&n,&k); for (int i=1; i<=n; i++){ int x; scanf("%d",&x); find(x); } sort(a+1,a+cnt+1); int tmp=1; for (int i=cnt; i>0; i--){ if (a[i]==a[i+1]) tmp++; else{ if (tmp>=k){ printf("%d\n",a[i+1]); return 0; } tmp=1; } } return 0; }
BZOJ2257: [Jsoi2009]瓶子和燃料