zoukankan      html  css  js  c++  java
  • 排序的练习题

    今天LITTLESUN终于可以闯排序的关了!

    先是刷了一道水题试炼一下STL的快排,顺便练习了一下约分(求最大公约数)的技能。

    T1     洛谷P1888三角函数 题目链接:https://www.luogu.org/problemnew/show/P1888

    这道题如果注意到题目中的条件是勾股数很快就可以A掉,但如果惯性思维的用余弦定理来转换为正弦定理。在计算过程中会有部分测试点的数据范围直接把long long炸掉。

    LITTLESUN的代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    int main()
    {
    int A[5];
    for(int i=1;i<=3;i++)
    {
    scanf("%d",&A[i]);
    }
    sort(A,A+2);
    int css=A[2]*A[2]+A[3]*A[3]-A[1]*A[1];
    int csx=2*A[2]*A[3];

    css=css/__gcd(css,csx);
    csx=csx/__gcd(css,csx);
    cout<<css<<"/"<<csx;
    return 0;
    }

    T2     洛谷P1866编号 题目链接:https://www.luogu.org/problemnew/show/P1866

    这道题也只是简单的用了STL中的快排,这道题中的“mod 1000000007”非常关键,我们不能直接让结果mod 1000000007,因为在过程中数据就足以炸掉long long。根据加减乘的运算中过程先mod对结果不造成影响。所以我们应该在计算中每一步都mod 1000000007。

    LITTLESUN的代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #define MAXN 10000
    using namespace std;
    int A[MAXN];
    int main()
    {
    int N;
    scanf("%d",&N);
    for(int i=1;i<=N;i++)
    {
    scanf("%d",&A[i]);
    }
    sort(A+1,A+N+1);
    long long num=1;
    bool a=0;
    for(int i=1;i<=N;i++)
    {
    num=num*(A[i]-(i-1));
    num=num%1000000007;
    a=1;
    }
    if(a==1)
    {
    printf("%lld",num);
    }
    else
    {
    printf("0");
    }
    return 0;
    }

    T3     洛谷P1125笨小猴  题目链接:https://www.luogu.org/problemnew/show/P1125

    这道题用到的是桶排序,注意在将字符串转化后数字应存在数组中。在判断是否为素数时要记得考虑0和1 的特殊情况。

    LITTLESUN的代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #define MAXN 10010
    using namespace std;
    char A[MAXN];
    int B[MAXN]={0},a[MAXN];
    bool pd(int i)
    {
    int k=2;
    for(;k<=sqrt(i)&&i%k!=0;k++);
    if(k>sqrt(i)&&i!=1&&i!=0)return 1;
    else return 0;
    }
    int main()
    {
    scanf("%s",A);
    for(int i=0;i<strlen(A);i++)
    {
    a[i]=A[i]-'a';
    }
    for(int i=0;i<strlen(A);i++)
    {
    B[a[i]]++;
    }
    //printf("%d",B[4]);
    int maxn=-1;
    int minn=500;
    for(int i=0;i<=25;i++)
    {
    if(B[i]>maxn)
    {
    maxn=B[i];
    }
    if(B[i]<minn&&B[i]!=0)
    {
    minn=B[i];
    }
    }
    //printf("%d%d",maxn,minn);
    int num=maxn-minn;
    if(pd(num))
    {
    printf("Lucky Word ");
    printf("%d",num);
    }
    else
    {
    printf("No Answer ");
    printf("0");

    }
    return 0;
    }

    先暂时整理到这里了,之后再做到有关排序的简单题还会继续更新。

  • 相关阅读:
    链表实现
    @Aspect
    mybatis plus
    using
    50道题
    梦想,青春,时间
    存储过程!!!
    事务,视图,索引
    高级查询--嵌套和相关,两套分页!!!
    学习笔记
  • 原文地址:https://www.cnblogs.com/LITTLESUNwl/p/10458592.html
Copyright © 2011-2022 走看看