zoukankan      html  css  js  c++  java
  • p1373【奶牛的卧室】

        

    描述 Description
    奶牛们有一个习惯,那就是根据自己的编号选择床号。如果一头奶牛编号是a,并且有0..k-1一共k张床,那么她就会选择a mod k号床作为她睡觉的地点。显然,2头牛不能睡在一张床上。那么给出一些奶牛的编号,请你为她们准备一间卧室,使得里面的床的个数最少。



    输入格式 Input Format
    第一行是奶牛的个数n(1<=n<=5000);第2到第n+1行是每头奶牛的编号Si(1<=Si<=1000000)。



    输出格式 Output Format
    仅一行,是最少的床的数目。


    样例输入 Sample Input
    5
    4
    6
    9
    10
    13


    样例输出 Sample Output
    8


    时间限制 Time Limitation
    1s


    注释 Hint
    1s


    来源 Source
    未知 

          (这道题非常的水..........(OJ上的数据才水.......))

          第一次写数论题,也刚刚开始学,读题可知就是让你求(a-b)mod m=0求这个m的最小值,使得m不为任何一个差的约数

          所以刚开始先sort排序一遍,求出每两个数之间的差数,然后求出最小的m即可。这样一来不是直接bool型数组判断没两

          个数之间的约数使f[a[j]-a[i]]=true;然后在扫一遍不就完啦!!(这么水吗)但是你发现你只拿到了90分,

          为什么被挖了一组呢因为如果这两个数的倍数也为差数,那么这个m也不成立了哇,所以在判断一下这个

          数的约数是不是其他两个数的差即可了。

          

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 using namespace std;
     7 inline int read()
     8 {
     9     int x=0,f=1;
    10     char ch=getchar();
    11     while(ch>'9'||ch<'0')
    12     {
    13         if(ch=='-')
    14             f=-1;
    15         ch=getchar();
    16     }
    17     while(ch<='9'&&ch>='0')
    18     {
    19         x=x*10+ch-'0';
    20         ch=getchar();
    21     }
    22     return x*f;
    23 }
    24 int a[5100];
    25 bool vis[1001000];
    26 int main()
    27 {
    28     int n;
    29     n=read();
    30     for(int i=1;i<=n;i++)
    31     {
    32         a[i]=read();
    33     }
    34     int ans=0;
    35     sort(a+1,a+1+n);
    36     for(int i=1;i<n;i++)
    37     {
    38         for(int j=i+1;j<=n;j++)
    39         {
    40             vis[a[j]-a[i]]=1;
    41         }
    42     }
    43     /*for(int i=1;i<=a[n];i++)90分算法
    44         if(!vis[i])
    45         {
    46             cout<<i<<endl;
    47             break;
    48         }*/
    49     int h;
    50     for(int i=2;i<=a[n];i++)
    51     {
    52         bool flag=false;
    53         if(vis[i])
    54             continue;
    55         h=i*2;
    56         while(h<a[n])//判断这个数的倍数是不是任意两个数的差
    57         {
    58             if(vis[h])
    59             {
    60                 flag=true;
    61                 break;
    62             }
    63             h+=i;
    64         }
    65         if(!flag)
    66         {
    67             ans=i;
    68             break;
    69         }
    70     }
    71     cout<<ans<<endl;
    72     return 0;
    73 }
    ( • ̀ω•́ )✧
  • 相关阅读:
    sed cat 命令
    Datetime 时间模块求日期差
    Selenium:截图显示等待
    SAS常用函数
    SAS笔记
    python 简明教程 【转】
    numpy 笔记
    android Adapter使用详解
    Eclipse的使用技巧之eclipse里的查找:
    Hierarchy Viewer之官方文档翻译之中英对照之未完不续版之使用详解.
  • 原文地址:https://www.cnblogs.com/lcyhaha/p/7403487.html
Copyright © 2011-2022 走看看