通师高专科技创新社周赛Round23

P1075 [NOIP2012 普及组] 质因数分解

题目链接

题意

已知正整数 n是两个不同的质数的乘积,试求出两者中较大的那个质数。

思路

  1. for循环n%i
  2. 输出最大质数

坑点

  1. 输出最大的质数

算法一:

实现步骤
  1. 输入n
  2. for循环找出n%i
  3. 输出最大的质数
代码
#include<cstdio>
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=2;i<=n;i++)
    { 
        if(n%i==0)
        {
            printf("%d",n/i);
            return 0;
        }
    }
	return 0; 
}

总结

基础题 无难度

P3742 umi的函数

题目链接

题意

这个函数接受两个字符串 s1,s2。这些字符串只能由小写字母组成,并且具有相同的长度。这个函数的输出是另一个长度与 s1,s2 相同的字符串 g。g 的第 i 个字符等于 s1 的第i 个字符和 s2 的第 i 个字符的最小值,简单来说,g[i]=min(s1[i],s2[i])。

例如:f(“ab”,“ba”)= “aa”, f(“nzwzl”,“zizez”)=“niwel”.

她现在有两个相同长度的只有小写字母的字符串 x,y。找出任何一个满足 f(x,z)=y 的

字符串 z。如果找不到这样的字符串的话,请输出-1。

思路

  1. 如果X有任何一个地方小于Z,就找不到解,输出-1,结束。
  2. 如果没有,因为Y本身就是Z的一种解,就不用找了,直接输出Z。

坑点

算法一:

实现步骤
  1. 输入
  2. 找出下x[i]<在z[i]的情况 输出-1
  3. 输出z
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{    
    long long int t,n,i;
    char x[101],z[101];
    cin>>n; 
    cin>>x; cin>>z; 
    for (i=0;i<n;i++)
        if (x[i] < z[i])
        {
            cout<<-1<<endl;
            return 0;
        }
    cout<<z<<endl;
    return 0;
}

总结

基础题

P6364 [传智杯 #2 初赛] 1024 程序员节发橙子

题目链接

题意

每年的 1024 程序员节日,黑马程序员都会举办大型的庆祝活动。今年的程序员节也不例外,每个班级的同学都发了橙子。班级里有 n 名同学从前到后排成一排,且已经得知了这些同学的成绩,其中第 ii 名同学的成绩是 ai 。班主任想根据同学们上个阶段的考试成绩来评定发橙子的数量。为了激励成绩优秀同学,发橙子时需要满足如下要求:相邻同学中成绩好的同学的橙子必须更多。若相邻的同学成绩一样,则它们分到的数量必须平等。每个同学至少分配一个橙子
由于预算有限,班主任希望在符合要求的情况下发出尽可能少的橙子。请问,至少需要准备多少橙子呢?

思路

  1. 定义结构体
  2. 枚举找出最少准备橙子数量
  3. 输出个数

坑点

算法一:枚举

实现步骤
  1. 定义结构体
  2. 枚举找出最少准备橙子数量
  3. 输出个数
代码

#include<bits/stdc++.h>
using namespace std;int n;long long ans;struct node{//定义结构体 ​
        int s,t;}a[1000005];int main(){​
        cin>>n;​
        a[1].s=1;//a[1]要手动标记成 1 ​
        cin>>a[1].t;for(int i=2;i<=n;i++){​
                cin>>a[i].t;//这里可以把输入放在一起,不影响 ​
                if(a[i].t>a[i-1].t)a[i].s=a[i-1].s+1;//成绩比前一个人高的情况 ​
                else if(a[i].t==a[i-1].t)a[i].s=a[i-1].s;//成绩相同的情况 ​
                else a[i].s=1;//剩下来就是成绩比前一个人低的情况了 ​
        }for(int i=n;i>=1;i--){if(a[i].t>a[i+1].t)a[i].s=max(a[i].s,a[i+1].s+1);//这里和下一个要用max判断 ​
                else if(a[i].t==a[i+1].t)a[i].s=max(a[i].s,a[i+1].s);​
                ans+=a[i].s;//这里标完了可以直接加进总数了 ​
        }​
        cout<<ans;return 0;}

总结

枚举

P1106 删数问题

题目链接

题意

键盘输入一个高精度的正整数 N(不超过 250 位),去掉其中任意 k 个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的 N 和 k,寻找一种方案使得剩下的数字组成的新数最小。

思路

  1. 将第一位所有可能的位置枚举一下,取最小且最前的一个
  2. 要取最前的一个,尽量保留更多的可选数
  3. 第二位就在第一个数之后的所有允许范围内枚举

坑点

  1. 注意删除前导0
  2. 当把数删为0时,要输出0。

算法一:XX+XX

实现步骤
  1. 将第一位所有可能的位置枚举一下,取最小且最前的一个
  2. 要取最前的一个,尽量保留更多的可选数
  3. 第二位就在第一个数之后的所有允许范围内枚举
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
    char num[500];
    int gs,bl;
    scanf("%s%d",&num,&gs);//读入
    int len=strlen(num);//取总长
    bl=len-gs;//得到需要保留的数的个数
    int shu[500];
    for(int i=0;i<len;i++)shu[i]=num[i]-'0';//转化为整数类型,并存储
    int bln[500],js=0,sgw=-1;//注意初始化,上一个开头要取-1,因为第一位有可能取第0个
    int lim,minn;
    while(bl-js)//即枚举bl次
    {
        minn=2e9;//初始化,minn=inf
        for(int i=sgw+1;i<=len-bl+js;i++)if(shu[i]<minn)minn=shu[sgw=i];//取最小且最前的数
        bln[js++]=shu[sgw];//加入到数中
    }
    int start=0;
    while(bln[start]==0&&bl-start-1)start++;//去前导零
    for(int i=start;i<bl;i++)printf("%d",bln[i]);//输出
    return 0;
}

总结

贪心

P1088 [NOIP2004 普及组] 火星人

题目链接

题意

火星人用一种非常简单的方式来表示数字――掰手指。火星人只有一只手,但这只手上有成千上万的手指,这些手指排成一列,分别编号为 1,2,3,⋯。火星人的任意两根手指都能随意交换位置,他们就是通过这方法计数的。
一个火星人用一个人类的手演示了如何用手指计数。如果把五根手指――拇指、食指、中指、无名指和小指分别编号为 1,2,3,4 和 5,当它们按正常顺序排列时,形成了 5 位数 12345,当你交换无名指和小指的位置时,会形成 5 位数 12354,当你把五个手指的顺序完全颠倒时,会形成 54321,在所有能够形成的 120 个 5 位数中,12345 最小,它表示 1;12354 第二小,它表示 2;54321 最大,它表示 120。下表展示了只有 33根手指时能够形成的 6 个 3 位数和它们代表的数字:

思路

  1. 输入你n,m
  2. 输入a[i]
  3. 运用全排列函数

坑点

算法一:stl全排列函数

实现步骤
  1. 运用全排列函数
代码

#include<stdio.h>
#include<algorithm>
using namespace std;int n,a[10010];int main(){int m,i;scanf("%d%d",&n,&m);for(int i=0;i<n;i++){scanf("%d", &a[i]);}while(m--){next_permutation(a,a+n);}for(int i=0;i<n;i++){printf("%d ",a[i]);}return 0;}

总结

全排列函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值