A Simple Stone Game

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 1247    Accepted Submission(s): 287

Problem Description
After he has learned how to play Nim game, Bob begins to try another stone game which seems much easier.

The game goes like this: one player starts the game with N

piles of stones. There is ai

stones on the i

th pile. On one turn, the player can move exactly one stone from one pile to another pile. After one turn, if there exits a number x(x>1)

such that for each pile bi

is the multiple of x

where bi

is the number of stone of the this pile now), the game will stop. Now you need to help Bob to calculate the minimum turns he need to stop this boring game. You can regard that 0

is the multiple of any positive number.

 
Input
The first line is the number of test cases. For each test case, the first line contains one positive number N(1≤N≤100000)

, indicating the number of piles of stones.

The second line contains N

positive number, the i

th number ai(1≤ai≤100000)

indicating the number of stones of the i

th pile.

The sum of N

of all test cases is not exceed 5∗105

.

 
Output
For each test case, output a integer donating the answer as described above. If there exist a satisfied number x

initially, you just need to output 0

. It's guaranteed that there exists at least one solution.

 
Sample Input
2
5
1 2 3 4 5
2
5 7
 
Sample Output
2
1
 
Source
 
铜牌题坑就是多呀,注意读懂题意,sum是会爆int的,还有sum本身就有可能是个素数,其他的就没啥坑了。
 
解题思路:求出石子总数sum,能整除sum的质数肯定满足x,遍历1-1e5的所有质数,统计满足x的有多少个。然后遍历满足x的质数,求出最小的移动次数,与sum减去最大堆(sum为质数的情况)的值作比较,取小的便是最终答案。具体操作看代码,代码比文字好理解(●'◡'●)
 
  1 #include<iostream>
2 #include<string.h>
3 #include<algorithm>
4 #include <cstdio>
5 using namespace std;
6 typedef long long ll;
7 const int maxn = 1e5+10;
8 int nu[maxn];
9 int prim[maxn];
10 bool isprim[maxn];
11 int res[maxn];
12 int cop[maxn];
13 int len;
14 void euler(int maxx)
15 {
16 memset(isprim,true,sizeof(isprim));
17 isprim[1]=false;
18 len=0;
19 for(int i=2;i<=maxx;++i)
20 {
21 if(isprim[i]) prim[++len]=i;
22 for(int j=1;j<=len && i*prim[j]<=maxx;++j)
23 {
24 isprim[i*prim[j]]=false;
25 if(i%prim[j]==0) break;
26 }
27 }
28 }
29 int main()
30 {
31 euler(1e5);
32 int t;
33 scanf("%d",&t);
34 while(t--)
35 {
36 int n;
37 scanf("%d",&n);
38 ll sum=0;
39 for(int i=0;i<n;++i)
40 {
41 scanf("%d",&nu[i]);
42 sum+=nu[i];
43 }
44 sort(nu,nu+n);
45 ll ans = sum-nu[n-1];
46 int le=0;
47 for(int i=1;i<=len;++i)
48 {
49 if(sum%prim[i]==0)
50 {
51 res[++le]=prim[i];
52 while(sum%prim[i]==0)
53 sum/=prim[i];
54 }
55 }
56
57 for(int i=1;i<=le;++i)
58 {
59 // printf("%di ",res[i]);
60 for(int j=0;j<n;++j)
61 {
62 cop[j]=nu[j]%res[i];
63 // printf("%d ",cop[j]);
64 }
65 sort(cop,cop+n);
66 ll cnt=0;
67 int l=0,r=n-1;
68 while(l<r)
69 {
70 // printf("@");
71 if(cop[l]==0)
72 {
73 l++;
74 continue;
75 }
76 if(cop[l]+cop[r]==res[i])
77 {
78 cnt+=cop[l];
79 // printf("\n%d##\n",cnt);
80 l++;
81 r--;
82 }
83 else if(cop[l]+cop[r]<res[i])
84 {
85 cop[r]+=cop[l];
86 cnt+=cop[l];
87 l++;
88 }
89 else if(cop[l]+cop[r]>res[i])
90 {
91 cnt+=res[i]-cop[r];
92 cop[l]-=(res[i]-cop[r]);
93 r--;
94 }
95 }
96 // printf("\n%d##\n",cnt);
97 ans=min(cnt,ans);
98 // printf("\n%d###\n",ans);
99 }
100 printf("%lld\n",ans);
101 }
102 return 0;
103 }

hdu-6237的更多相关文章

  1. HDU 6237.A Simple Stone Game-欧拉函数找素因子 (2017中国大学生程序设计竞赛-哈尔滨站-重现赛)

    A Simple Stone Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Ot ...

  2. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  3. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  4. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  5. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  6. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

  7. HDU 1796How many integers can you find(容斥原理)

    How many integers can you find Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d ...

  8. hdu 4481 Time travel(高斯求期望)(转)

    (转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...

  9. HDU 3791二叉搜索树解题(解题报告)

    1.题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3791 2.参考解题 http://blog.csdn.net/u013447865/articl ...

  10. hdu 4329

    problem:http://acm.hdu.edu.cn/showproblem.php?pid=4329 题意:模拟  a.     p(r)=   R'/i   rel(r)=(1||0)  R ...

随机推荐

  1. SpringMVC下关于静态资源访问

    SpringMVC静态资源访问 聊一聊关于静态资源的访问问题 首先,我们要对web.xml里面的DispatcherServlet进行设置 <!-- 中央调度器--> <servle ...

  2. innodb引擎的4大特性

    一:插入缓冲 二:二次写 三:自适应哈希 四:预读 1.插入缓冲(insert buffer)插入缓冲(Insert Buffer/Change Buffer):提升插入性能,change buffe ...

  3. 前端PDF文件转图片方法

    第一步:先下载pdfjs,网址:PDF下载地址,再引入到项目中,我是标签直接引用的 <script src="pdfjs/build/pdf.js"></scri ...

  4. 容器化安装Mysql 8.0 并部署主从复制

    系统: Centos 7.4 数据库版本:8.0.20 两台机器做相同操作 安装Docker export VERSION=18.06 && curl -fsSL http://rai ...

  5. pytest:通过scope控制fixture的作用范围

    一.fixture里面有个参数scope,通过scope可以控制fixture的作用范围,根据作用范围大小划分:session>module>class>function,具体作用范 ...

  6. docker容器的基本命令

      #安装docker yum -y install docker systemctl start docker.service systemctl status docker systemctl e ...

  7. 2021/1/20随记,MTU

    背景: 事情是这样的,客户2台防火墙部署了ipsec,内网互通,但是其中ssh以及其他大命令之类的操作就会卡住,简单的vi命令可以使用. 解决: 排除网络问题,因为内网互通,其次是系统层面问题,最终定 ...

  8. Spring Boot使用MongoDB GridFS进行文件的操作

    1. GridFS简介 GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片.音频.视频等),但是它是存储在MonoDB的集合中. GridFS 会将文件对象分割成多个的ch ...

  9. CF976B

    这是一道考验思维找规律的题,很有可做性. 正文 题意 一个 n * m 的矩阵,从左上角(1 , 1) 开始,先向下走直到最下方,再向右走到最右,再向上走一个,再走到最左......一直走到(1 , ...

  10. Java 实现Redis客户端,服务端

    Java 实现Redis客户端,服务端 1.Java实现Redis发布订阅 1.1实例 2.[Redis]Java实现redis消息订阅/发布(PubSub) 3.java实现 redis的发布订阅 ...