P1075 [NOIP2012 普及组] 质因数分解
题意
已知正整数 n是两个不同的质数的乘积,试求出两者中较大的那个质数。
思路
- for循环n%i
- 输出最大质数
坑点
- 输出最大的质数
算法一:
实现步骤
- 输入n
- for循环找出n%i
- 输出最大的质数
代码
#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。
思路
- 如果X有任何一个地方小于Z,就找不到解,输出-1,结束。
- 如果没有,因为Y本身就是Z的一种解,就不用找了,直接输出Z。
坑点
- 无
算法一:
实现步骤
- 输入
- 找出下x[i]<在z[i]的情况 输出-1
- 输出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 。班主任想根据同学们上个阶段的考试成绩来评定发橙子的数量。为了激励成绩优秀同学,发橙子时需要满足如下要求:相邻同学中成绩好的同学的橙子必须更多。若相邻的同学成绩一样,则它们分到的数量必须平等。每个同学至少分配一个橙子
由于预算有限,班主任希望在符合要求的情况下发出尽可能少的橙子。请问,至少需要准备多少橙子呢?
思路
- 定义结构体
- 枚举找出最少准备橙子数量
- 输出个数
坑点
- 无
算法一:枚举
实现步骤
- 定义结构体
- 枚举找出最少准备橙子数量
- 输出个数
代码
#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,寻找一种方案使得剩下的数字组成的新数最小。
思路
- 将第一位所有可能的位置枚举一下,取最小且最前的一个
- 要取最前的一个,尽量保留更多的可选数
- 第二位就在第一个数之后的所有允许范围内枚举
坑点
- 注意删除前导0
- 当把数删为0时,要输出0。
算法一:XX+XX
实现步骤
- 将第一位所有可能的位置枚举一下,取最小且最前的一个
- 要取最前的一个,尽量保留更多的可选数
- 第二位就在第一个数之后的所有允许范围内枚举
代码
#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 位数和它们代表的数字:
思路
- 输入你n,m
- 输入a[i]
- 运用全排列函数
坑点
- 无
算法一:stl全排列函数
实现步骤
- 运用全排列函数
代码
#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;
}
总结
全排列函数