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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章