ACM选修课2 排序问题

news/2024/5/20 0:36:08 标签: c语言, 算法, 编程语言, 快速排序

基本编程知识

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

(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;
}

http://www.niftyadmin.cn/n/816065.html

相关文章

ACM选修课3 递归

递归算法 定义&#xff1a;自己调用自己&#xff08;需要调用栈来执行&#xff09; 两个基本要素&#xff1a;边界条件&#xff08;何时结束&#xff09;和 递归模式&#xff08;大问题如何转化为小问题&#xff09; 关键&#xff1a;根据递推关系式写程序&#xff08;用数学归…

ACM选修课4 高精度

高精度算法 stirling公式&#xff1a;n&#xff01;~ (n/e)n(2*pai*n)1/2^ &#xff08;n趋向正无穷成立 当n大于100时可用&#xff09; 例题 初等算数 #include <bits/stdc.h> using namespace std; int main() {long long int a,b;while(cin>>a>>b){if…

数据结构 单链表总结(c/c++)

有关动态内存分配的函数 1、malloc函数 函数原型为void *malloc(unsigned int size); 作用是在内存的动态存储区中分配一个长度为size的连续空间。此函数的值&#xff08;即“返回值”&#xff09;是一个指向分配域起始地址的针&#xff08;类型为void&#xff09;。如果此函数…

ACM选修课5 贪心法

贪心法 部分最优&#xff0c;结果最优&#xff08;需证明&#xff09; 贪心问题的特征&#xff1a; 1、一个问题的最优解包含其子问题的最优解 2、整体最优解可以通过局部的最优的选择 例题 老鼠的旅行 #include <bits/stdc.h> using namespace std; struct sa {int…

ACM选修课6 二分法与构造矩阵

二分法 lower_bound()返回值是一个迭代器,返回指向大于key的第一个值的位置 使用&#xff1a;lower_bound(a,a8,key)-a upper_bound()返回值是一个迭代器,返回指向大于等于key的第一个值的位置 使用&#xff1a;upper_bound(a,a8,key)-a 例题 二分查找 #include <bits/…

数据结构 建立单调有序链表

方法一&#xff1a;先建立链表&#xff0c;后对链表进行排序 #include <stdio.h> #include <stdlib.h> typedef struct LNode {int data;struct LNode *next; }; void creatListH(struct LNode *head, int n);//创建链表 void print(struct LNode *head);//输出链…

Washall算法

Washall算法可由一个图的邻接矩阵求它的可达矩阵,形式上很简单,就是一个三层循环, 问题引出&#xff1a;在一个图结构中&#xff0c;常常需要找两个节点之间有没有一条通路&#xff08;通路长任意&#xff09;&#xff0c;也就是任意两点之间的可达情况&#xff0c;我们很自然…

ACM公选课7/8 DP算法

DP算法 动态规划法设计算法一般分成三个阶段&#xff1a; &#xff08;1&#xff09;分段&#xff1a;将原问题分解为若干个相互重叠的子问题&#xff1b; &#xff08;2&#xff09;分析&#xff1a;分析问题是否满足最优性原理&#xff0c;找出动态规划函数的递推式&#xff…