HDU 6237 A Simple Stone Game(CCPC 2017 哈理工)(素数分解+贪心)(好题)
来源:互联网 发布:英语离线翻译软件 编辑:程序博客网 时间:2024/06/05 06:06
题目
题意:
给你n堆石子,每次你可以从任意一堆里取出一个石子放到其他堆里,可以把一堆石子取空。问如何经过最少的次数使各堆石子的GCD值>1,求最小次数。
数据范围n<=1e5,每堆石子数<=1e5。
思路:
NIM出现就是迷惑人的,正解是素数分解。
把a数组的和sum求出来,对sum素数分解,然后对每一个素因子遍历,求出a数组中的所有数对当前素因子取余后的值,存到c数组里,接下来求操作总数。
先求c数组的总和,再对c数组按降序排列,对c数组遍历,每次操作数应该是当前的素因子-c[i],得出这个操作数的同时已经补满了一个“当前素因子”,直到所有数都补满,循环结束。
就像这样:(b是当前的素因子,sum是c数组的总和)
while(sum>0&&i<n)///此处贪心
{
ans+=b-c[i];
sum-=b;
i++;
}
#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>#include <algorithm>using namespace std;typedef long long LL;const int N=1e5+10;LL Stack[1000], top, Cnt[1000],tmp[1000];//stack是素因子数组,cnt是素因子的幂 //tmp[i]保存n!/(n-m)!中素因子stack[i]的个数void fenjie(LL k)//分解的是k{top = 0;memset(Cnt, 0, sizeof Cnt);for(LL i = 2; i*i<=k; i++)if(k%i==0){while(k%i==0)Cnt[top]++, k/=i;Stack[top++] = i;}if(k>1){Cnt[top]++;Stack[top++] = k;}}LL n;LL a[N],c[N];LL get(LL b){ LL x; memset(c,0,sizeof(c)); LL sum=0; for(LL i=0;i<n;i++) { x=a[i]%b; c[i]=x; sum+=x; } sort(c,c+n,greater<LL>()); LL i=0; LL ans=0; while(sum>0&&i<n)///此处贪心 { ans+=b-c[i]; sum-=b; i++; } return ans;}int main(){ int t; scanf("%d",&t); while(t--) { scanf("%lld",&n); LL sum=0; LL maxn=0; for(LL i=0;i<n;i++) { scanf("%lld",&a[i]); sum+=a[i]; maxn=max(maxn,a[i]); } LL ans=sum-maxn; fenjie(sum); for(int i=0;i<top;i++) { ans=min(ans,get(Stack[i])); } printf("%lld\n",ans); } return 0;}
阅读全文
0 0
- HDU 6237 A Simple Stone Game(CCPC 2017 哈理工)(素数分解+贪心)(好题)
- HDU-6237 A Simple Stone Game (素数筛 + 贪心)
- HDU 6237/2017CCPC哈尔滨 A Simple Stone Game【质因子】
- hdu 6237 A Simple Stone Game (求素因子+贪心)
- hdu6237-2017哈尔滨CCPC-质因子&贪心&暴力-A Simple Stone Game
- HDU-6237:A Simple Stone Game(数论)
- 2017CCPC哈尔滨 H:A Simple Stone Game
- HDU 6237 A Simple Stone Game
- hdu A Simple Stone Game
- A simple stone game (poj3922,博弈)
- hdu 2486 A simple stone game
- 【hdu 2486】A simple stone game
- hdoj 6237 A Simple Stone Game
- hdu2486 A simple stone game
- HDU_2580 A simple stone game
- hdu2580 a simple stone game
- HDU A simple stone game [K倍动态减法游戏]
- HDU 2486 HDU2580 POJ3922 a simple stone game
- DeepLearning学习指导
- Neural Networks and Deep Learning 学习笔记
- top命令详解
- 桶排序
- 一切都是新的
- HDU 6237 A Simple Stone Game(CCPC 2017 哈理工)(素数分解+贪心)(好题)
- webSocket 如何实现服务器端 想页面推送实时数据? 动态数据?如何进行连接?
- js 图片 点击查看大图
- 用U盘制作并安装WIN10 64位原版系统的详细教程
- a类b类c类ip地址范围
- Android进阶-View系列(一)-坐标系和视图坐标系
- 1059. C语言竞赛(20)
- java11月13日
- 【转】inode缓存与dentry缓存