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

    A Simple Stone Game

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


    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 ith 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(1N100000), indicating the number of piles of stones.

    The second line contains N positive number, the ith number ai(1ai100000) indicating the number of stones of the ith pile.


    The sum of N of all test cases is not exceed 5105.
     
    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
    2017 ACM/ICPC 哈尔滨赛区网络赛——测试专用
     

    题意就是任意的一堆石头一次只能移动到其他堆石头一次,比如一开始为8,移动一次就为7啦,问最少移动几次使得移动后的数都能够被某个数整除(就是他们有一个因子相同)

    思路:石头数求和,求出的值进行欧拉函数找出来素因子,然后通过对石头数进行取余操作,再对剩下的余数进行操作。

    只需要将余数求和,然后将余数按从大到小的顺序,将大的数补满(因为不确定是移动哪个小的数,所以直接补大的数),补成素因子,然后减去加上去的数就可以。

    思路很好写,但是智障wa了好几次,初始化初始错了,改好之后,又发现for循环是<cnt,不是<=cnt。。。

    谢谢我的队友,愿意给我这个猪队友查错。。。

    代码:

     1 #include<cstdio>
     2 #include<cmath>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 using namespace std;
     7 typedef long long ll;
     8 const int N=1e5+10;
     9 ll a[N],b[N];
    10 ll phi[N];
    11 ll sum,cnt;
    12 bool cmp(int a,int b){
    13     return a>b;
    14 }
    15 
    16 void findprime(){   //找出来素因子
    17     cnt=0;
    18     for(ll i=2;i<=sqrt(sum);i++){
    19         if(sum%i==0)
    20             phi[cnt++]=i;
    21         while(sum%i==0)
    22             sum/=i;
    23     }
    24     phi[cnt++]=sum;   //找出来的素因子存在这个数组里
    25 }
    26 
    27 int main(){
    28     int t,n;
    29     ll h,num,ret,minn;
    30     scanf("%d",&t);
    31     while(t--){
    32         scanf("%d",&n);
    33         sum=0;
    34       for(int i=0;i<n;i++){
    35         scanf("%lld",&a[i]);
    36         sum+=a[i];
    37       }
    38     findprime();
    39     minn=1e10+10;
    40     for(int j=0;j<cnt;j++){   //跑一遍所有的素因子,本来素因子就很少,不会超时
    41         num=0;
    42         for(int i=0;i<n;i++)
    43             b[i]=a[i];
    44         for(int i=0;i<n;i++){
    45             b[i]=b[i]%phi[j]; //取余操作
    46             num+=b[i];
    47         }
    48         ret=0;
    49         sort(b,b+n,cmp);
    50         int i=0;
    51         while(num>0&&i<n){
    52             ret+=phi[j]-b[i];//将补的次数(移动次数)加到ret中
    53             num-=phi[j];//总数减去
    54             i++;
    55         }
    56         minn=min(minn,ret);//找出移动次数最小的
    57     }
    58     printf("%lld
    ",minn);
    59     }
    60     return 0;
    61 }

    太菜啦,每次都是错在一些很智障的地方上。

    本来会写的题目就不多,还经常出一些智障的错误。没写对和写不出来结果是一样的。

    菜哭(ಥ_ಥ)

    今天双十一,单身狗节快乐_(:з」∠)_ 

     
  • 相关阅读:
    越大优先级越高,优先级越高被OS选中的可能性就越大
    锁标记如果过多,就会出现线程等待其他线程释放锁标记
    使用带缓冲区的输入输出流的速度会大幅提高
    Bufferread有readline()使得字符输入更加方便
    java的开发主要以http为基础
    UDP也需要现有Server端,然后再有Client端
    端口是一种抽象的软件结构,与协议相关
    具有全球唯一性,相对于internet,IP为逻辑地址
    判断是否一个属性或对象可序列化
    把对象通过流序列化到某一个持久性介质称为对象的可持久化
  • 原文地址:https://www.cnblogs.com/ZERO-/p/7819884.html
Copyright © 2011-2022 走看看