zoukankan      html  css  js  c++  java
  • 2017-9-20 NOIP模拟赛

    A 约数之和

    (count.pas/c/cpp)
    TL:1S ML:128MB
    【Description】
    我们用 D(x)表示正整数 x 的约数的个数。给定一个正整数 N,求 D(1)+D(2)+…+D(N)。
    【Input】
    一行一个正整数 N。
    【Output】
    一行一个整数,表示答案
    【Sample Input】
    5
    【Sample Output】
    10
    【Hint】
    样例解释:
    D(1)=1 D(2)=2
    D(3)=2 D(4)=3 D(5)=2
    对于 20%的测试数据:N<=1000
    对于 50%的测试数据:N<=100000
    对于 100%的测试数据:N<=10000000

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int n;
    long long ans;
    int main(){
        freopen("count.in","r",stdin);
        freopen("count.out","w",stdout);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)ans+=n/i;
        cout<<ans;
        fclose(stdin);fclose(stdout);
        return 0;
    }
    100分 数论

    B 邮局选址

    (post.pas/c/cpp)
    TL:1S ML:128MB
    【Description】
    在 J 市的一条笔直的公路旁分布着 n 个村庄,每个村庄都有一个唯一的坐标 Xi,任意一
    对村庄的坐标不同。最近,J 市领导计划在村庄里新建 m 个邮局,而邮局在 n 个村庄里
    的分布情况会影响到居民的便利程度。
    设 m 个邮局分别建在 P1,P2,..,Pm 号村庄。每个村庄的村民都会找到与其距离最近的一
    个邮局, 若有多个距离最近的则会任选一个, 该村庄的便利度即为该村庄与其最近的邮局的
    距离,而所有村庄的便利度的和即为总便利度。
    严格地讲,总便利度 C 定义为
    ∑min⁡ {|?? − ???|⁡(1 ≤ ? ≤ ?)}
    ?
    ?=1
    现在,由你来安排邮局的建设位置。请计算最小的 C 是多少。
    【Input】
    第一行两个整数 n m
    第二行递增的 n 个整数,表示 X1..Xn
    【Output】
    一行一个整数,表示最小的 C
    【Sample Input】
    10 5
    1 2 3 6 7 9 11 22 44 50
    【Sample Output】
    9
    【Hint】
    样例解释:建立在坐标为:2 7 22 44 50 的位置
    每个村庄的便利度分别为:1 0 1 1 0 2 4 0 0 0
    对于 30%的测试数据 n ≤ 10
    对于 60%的测试数据 n ≤ 50
    对于 100%的测试数据 1 ≤ n ≤ 300; 1 ≤ m ≤ 30; m ≤ n; 1 ≤ Xi ≤ 10000

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    using namespace std;
    #define maxn 310
    int n,m,p[maxn],a[maxn],ans=0x7fffffff;
    int qread(){
        int i=0;
        char ch=getchar();
        while(ch<'0'||ch>'9')ch=getchar();
        while(ch<='9'&&ch>='0'){i=i*10+ch-'0';ch=getchar();}
        return i;
    }
    void dfs(int pos,int cnt,int pre,int sum){
        if(sum>=ans)return;
        if(m-cnt>n+1-pos)return;
        int now=sum;
        if(cnt==m){
            for(int i=pos;i<=n;i++){
                now+=abs(p[i]-p[pos-1]);
            }
            ans=min(ans,now);
            return;
        }
        if(pos==n+1)return;
        dfs(pos+1,cnt,pre,sum);
        if(pre!=-1){
            for(int i=pre+1;i<=pos-1;i++){//pos处为邮局 
                now+=min(abs(p[i]-p[pos]),abs(p[i]-p[pre]));
            }
            dfs(pos+1,cnt+1,pos,now);
            return;
        }
        for(int i=1;i<=pos-1;i++){
            now+=p[pos]-p[i];
        }
        dfs(pos+1,cnt+1,pos,now);
    }
    int main(){
        //freopen("Cola.txt","r",stdin);
        freopen("post.in","r",stdin);
        freopen("post.out","w",stdout);
        n=qread();m=qread();
        for(int i=1;i<=n;i++)p[i]=qread();
        dfs(1,0,-1,0);
        printf("%d",ans);
    }
    40分 暴力+可行剪枝+最优剪枝
    /*
        f[i][j]表示前i个位置用了j个邮局的最小代价,可以发现当前状态只与上一个邮局的位置有关,即满足无后效性
        我们可以把一个邮局所管辖的范围当成一个区间
        枚举当前要安置的邮局的区间起点
        对于这个区间,我们发现需要处理区间中每个村庄的总花费,这个可以预处理出来 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    using namespace std;
    #define maxn 1010
    int n,m,f[maxn][maxn],cost[maxn][maxn],p[maxn];
    int main(){
        freopen("post.in","r",stdin);
        freopen("post.out","w",stdout);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)scanf("%d",&p[i]);
        for(int i=1;i<=n;i++)
            for(int j=i;j<=n;j++){
                int k=(i+j)>>1;
                cost[i][j]=0;
                for(int t=i;t<=j;t++)
                    cost[i][j]+=abs(p[k]-p[t]);
            }
        memset(f,127/3,sizeof(f));f[0][0]=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                for(int k=0;k<=i-1;k++)
                    f[i][j]=min(f[i][j],f[k][j-1]+cost[k+1][i]);
        printf("%d",f[n][m]);
    }
    100分 动态规划


    C 分数

    (fraction.pas/c/cpp)
    TL:2S ML:128MB
    【Description】
    在一门叫做计算机应用数学的神奇的课上,老师教给大家如何处理小数的进制转换:
    p 进制的小数 abc.def 的十进制值为: ? ∗ ? 2 + ? ∗ ? + ? +
    ?
    ?
    +
    ?
    ? 2
    +
    ?
    ? 3 。
    例如十进制数 1
    3 在十进制下小数表示为 0.33333…, 在三进制下为 0.1, 在三十进制下为 0.A。
    (这里 A 的含义与十六进制中 A 的含义相同,均表示 10) 。
    下课后,老师要求 kAc 将 N 个十进制的分数写成 k 进制下的小数。然而 kAc 发现,很多十
    进制分数根本不可能写成有限的 k 进制小数!这令他十分不爽,不过他想知道,最小需要几
    进制才能使得这些十进制分数在该进制下均为有限的小数。
    【Input】
    第一行两个整数 N
    接下来 N 行,每行两个整数 a, b,表示一个十进制小数 a
    b 。
    【Output】
    一个整数,表示最小进制数。这里,请按照十六进制输出,所有字母全部大写。 (例如,如
    果答案为十进制下 26,则输出 1A) 。
    【Sample Input】
    2
    3 99
    1 99
    1 11
    【Sample Output】
    21
    【Hint】
    样例解释:
    在 33 进制下,
    3
    99 可以表示为 0.1,
    1
    99 可以表示为 0.0B,
    1
    11 可以表示为 0.3。
    可以证明不存在更小的进制,使得他们均为有限小数。
    对于 20%的测试数据:n=1
    对于 50%的测试数据: n<=10, a, b <= 10000, 保证最终答案在十进制下不超过 10000。
    对于 70%的测试数据:n<=100,a, b<= 10000。
    对于 100%的测试数据:n<=1000,1 <= a,b <= 1000000000。

  • 相关阅读:
    运维自动化轻量级工具pssh
    Linux下的tar压缩解压缩命令详解
    [shell] while read line 与for循环的区别
    Linux sed命令
    [转]linux awk命令详解
    Centos7上部署openstack ocata配置详解
    自动化运维工具——puppet详解(一)
    OpenStack 初探(一) -- All-In-One模式部署(初学OpenStack必备)
    shell中的重定向(输入输出)
    vim批量注释和反注释快捷键
  • 原文地址:https://www.cnblogs.com/thmyl/p/7560686.html
Copyright © 2011-2022 走看看