ACM选修课2 排序问题

基本编程知识

当一个表达式对一个数取余的时候大概率存在周期,一般在三倍取模的数之内

(a+b)%c=(a%c+b%c)%c
(ab)%c=((a%c)(b%c))%c
ab%c=(a%c)b%c

例题

排序

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int a[15];//定义成long long用sort会出现问题
    while(scanf("%d",&a[0])!=EOF)
    {
        for(int i=1; i<10; i++)
            scanf("%d",&a[i]);
        sort(a,a+10);
        for(int i=0; i<9; i++)
            printf("%d ",a[i]);
        printf("%d\n",a[9]);
    }
    return 0;
}

枫之舞–排序

#include <bits/stdc++.h>
using namespace std;
int x[1005];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
            scanf("%d",&x[i]);
        sort(x,x+n,less<int>());
        for(int i=0;i<n-1;i++)
            printf("%d ",x[i]);
        printf("%d",x[n-1]);
        printf("\n");
    }
    return 0;
}

让气球飞吧

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char b[6][10]= {"red","green","blue","pink","black","orange"};
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int res[6]= {0};
        int k;
        for(k=0; k<n; k++)
        {
            char a[10];
            scanf("%s",a);
            int i;
            for(i=0; i<6; i++)
            {
                if(strcmp(b[i],a)==0)
                    res[i]++;
            }
        }
        int num=0,max=res[0];
        int j;
        for(j=1; j<6; j++)
        {
            if(max<res[j])
            {
                max=res[j];
                num=j;
            }
        }
        printf("%s\n",b[num]);
    }
    return 0;
}

数字序列

#include <bits/stdc++.h>
using namespace std;
int res[1000];
int main()
{
    res[1]=res[2]=1;
    int a,b,n;
    while(cin>>a>>b>>n)
    {
        if(a==0&&b==0&&n==0)
            break;
        if(n==1||n==2)
            cout<<res[n]<<endl;
        else
        {
            int i;
            for(i=3;i<1000;i++)//自动找循环节
            {
                res[i]=(a*res[i-1]+b*res[i-2])%7;
                if(res[i]==1&&res[i-1]==1)//只将一个循环节存入数组
                    break;
            }
            n=n%(i-2);//注意循环节的下标,输出会造成些问题
            if(n==0)
                cout<<res[i-2]<<endl;
            else
                cout<<res[n]<<endl;
        }
    }
    return 0;
}

昨日重现

#include <bits/stdc++.h>
using namespace std;
int main()
{
    long long int n;
    while(cin>>n)
    {
        long long int n1=n,n2=n+1,n3=2*n+1;
        long long int res;
        //运用公式F(n)=(1/6*n*(n+1)*(2n+1))%1007
        //对1/6的处理,拆成1/2*1/3,由题意一定能整除
        if(n1%2==0)
            n1=n1/2;
        else
            n2=n2/2;
        if(n1%3==0)
            n1=n1/3;
        else if(n2%3==0)
            n2=n2/3;
        else
            n3=n3/3;
        res=((((n1%1007)*(n2%1007))%1007)*(n3%1007))%1007;//疯狂取模避免溢出
        cout<<res<<endl;
    }
    return 0;
}

n!末尾有多少个0

观察个位数的乘法,仅有25能出现0
因此把n!进行因式分解一对2
5末尾就有一个0
而n!中2的数量一定大于5的数量
因此即统计n!因式分解后出现几个5即可

#include <bits/stdc++.h>
using namespace std;
int main()
{
    long long int n;
    while(cin>>n)
    {
        int res=0;
        while(n)
        {
            n=n/5;
            res=res+n;
        }
        cout<<res<<endl;
    }
    return 0;
}

Google is Feeling Lucky

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    int n=1;
    while(t--)
    {
        char ch[12][120];
        int num[12];
        for(int i=1; i<=10; i++)
            cin>>ch[i]>>num[i];
        int maxn=-999999;
        for(int i=1; i<=10; i++)
        {
            if(num[i]>maxn)
                maxn=num[i];
        }
        printf("Case #%d:\n",n);
        n++;
        for(int i=1; i<=10; i++)
            if(num[i]==maxn)
                cout<<ch[i]<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_46126537/article/details/105278872