zoukankan      html  css  js  c++  java
  • 济南学习 Day 3 T2 am

    看程序写结果(program)
    Time Limit:1000ms Memory Limit:64MB
    题目描述
    LYK 最近在准备 NOIP2017 的初赛,它最不擅长的就是看程序写结果了,因此它拼命地
    在练习。
    这次它拿到这样的一个程序:
    Pascal:
    readln(n);
    for i:=1 to n do read(a[i]);
    for i:=1 to n do for j:=1 to n do for k:=1 to n do for l:=1 to n do
    if (a[i]=a[j]) and (a[i]<a[k]) and (a[k]=a[l]) then ans:=(ans+1) mod 1000000007;
    writeln(ans);
    C++:
    scanf(“%d”,&n);
    for (i=1; i<=n; i++) scanf(“%d”,&a[i]);
    for (i=1; i<=n; i++) for (j=1; j<=n; j++) for (k=1; k<=n; k++) for (l=1; l<=n; l++)
    if (a[i]==a[j] && a[i]<a[k] && a[k]==a[l]) ans=(ans+1)%1000000007;
    printf(“%d ”,ans);
    LYK 知道了所有输入数据,它想知道这个程序运行下来会输出多少。
    输入格式(program.in)
    第一行一个数 n,第二行 n 个数,表示 ai。
    输出格式(program.out)
    一个数表示答案。
    输入样例
    4
    1 1 3 3
    输出样例
    4
    数据范围
    对于 20%的数据 n<=50。
    对于 40%的数据 n<=200。
    对于 60%的数据 n<=2000。
    对于 100%的数据 n<=100000,1<=ai<=1000000000。
    其中均匀分布着 50%的数据不同的 ai 个数<=10,对于另外 50%的数据不同的 ai 个
    数>=n/10。

    首先说:直接粘贴代码20%的数据肯定没问题,连对拍的代码都给你了,这个题还是比较良心的,20分,关键是如何优化

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #define N 100010
     6 using namespace std;
     7 const int mo=1e9+7;
     8 long long sum[N],a[N],num[N],ans;
     9 int n,x;
    10 int main()
    11 {
    12     scanf("%d",&n);
    13     for(int i=1;i<=n;i++)
    14       scanf("%d",&a[i]);
    15     sort(a+1,a+n+1);
    16     memset(num,0,sizeof num );
    17     for(int i=1;i<=n;i++)
    18     {
    19         if(a[i]!=a[i-1])
    20           x++;
    21         num[x]++;    
    22     }
    23     for(int i=1;i<=x;i++)
    24       num[i]=(num[i]*num[i])%mo;
    25     for(int i=1;i<=x;i++)
    26       sum[i]=sum[i-1]+num[i];
    27     for(int i=1;i<x;i++)
    28         ans=(ans+num[i]*(sum[x]-sum[i]))%mo;
    29     printf("%d",ans);
    30     return 0;
    31 }

     

     

    思路:读入之后,首先sort一遍,相同的数字肯定挨在了一起,扫一遍,记录每种数字出现的次数(即它的个数)(接下来用len表示),每一个len都平方一边,并用sum记录len^2的

    前缀和。对于第i种数字对于答案的贡献为leni*len(i+1)+leni*len(i+2)+....+leni*(lenx)

    即leni*(sum[x]-sum[i]);

     

  • 相关阅读:
    概述反射和序列化
    读书笔记6pandas简单使用
    读书笔记5基于matplotlib画图
    读书笔记4数据的读入和保存
    读书笔记3数组的一些常用函数
    introduction to python for statistics,analysis笔记3
    introduction to python for statistics,analysis笔记2
    introduction to anaconda
    图像的线性空间滤波matlab实现
    C-I/O操作函数详解
  • 原文地址:https://www.cnblogs.com/suishiguang/p/6037979.html
Copyright © 2011-2022 走看看