P7257 [COCI2009-2010#3] FILIP
题意
给你两个十进制正整数 a,b,输出将这两个数翻转后的较大数
思路
- 翻转
- 比大小
坑点
- 无
算法一:
实现步骤
- 先将a和b翻转
- 比大小
代码
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
int m,n;//反转后的a,b
m=a/100+(a%100/10)*10+(a%10)*100;//对m进行反转,分别对百位,十位,个位操作
n=b/100+(b%100/10)*10+(b%10)*100;//对n进行反转
if(m>n)
{
cout<<m;//如果m大,就输出m
}
else
{
cout<<n;//如果相等或n大,就输出n
}
return 0;
}
算法二:stl
实现步骤
- 翻转
- 取大值
代码
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
string a,b;
cin>>a>>b;
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
cout<<max(a,b);
return 0;
}
总结
基础题 无难度
P2670 [NOIP2015 普及组] 扫雷游戏
题意
扫雷游戏是一款十分经典的单机小游戏。在 n行 m 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。现在给出 n 行 m 列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。
思路
- *不变
- 计算?在3 × 3格子中 * 的数量
- 输出个数
坑点
- 无
算法一:数组
实现步骤
- *不变
- 计算?在33格子中的数量
- 输出个数
代码
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
char a[105][105];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]=='*')
{
cout<<'*';
}
int sum=0;//用于计数
else
{
if(a[i-1][j]=='*'){
sum++;
}
if(a[i+1][j]=='*'){
sum++;
}
if(a[i][j-1]=='*'){
sum++;
}
if(a[i][j+1]=='*'){
sum++;
}
if(a[i-1][j-1]=='*'){
sum++;
}
if(a[i-1][j+1]=='*'){
sum++;
}
if(a[i+1][j-1]=='*'){
sum++;
}
if(a[i+1][j+1]=='*'){
sum++;
}
cout<<sum;
}
}
cout<<endl;
}
return 0;
}
总结
数组题 花费时间多
P1981 [NOIP2013 普及组] 表达式求值
题意
给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。
思路
- 用到stl中栈的知识点
坑点
- 只要最后四位数
算法一:stl 栈
实现步骤
- 运用栈
- 遇到× 顶出栈 然后将结果重新压入栈
- 输出最后结果的最后四位
代码
#include <iostream>
#include <stack>
#include<algorithm>
#include<string.h>
using namespace std;
stack<int>st;
int main()
{
int a;
int b;
char c;//运算符
cin>>a;
a=a%10000;
st.push(a);//push用于把a压入栈中
while(cin>>c>>b)
{
if(c=='*')//讲前一个数和后一个数相乘
{
a=st.top();//top()取栈顶元素
st.pop();//pop用以弹出栈顶元素
st.push(a*b%10000);
}
else
{
st.push(b);
}
}
a=0;
while(!st.empty())//empty()可以检测stack内是否为空 当栈非空
{
a+=st.top();//输出栈顶 将栈里面的数全部相加
st.pop();//出栈
}
cout<<a%10000<<endl;
return 0;
}
总结
关于栈的表达式求值 基础题
P5740 【深基7.例9】最厉害的学生
题意
现有 N 名同学参加了期末考试,并且获得了每名同学的信息:姓名(不超过 8个字符的仅有英文小写字母的字符串)、语文、数学、英语成绩(均为不超过 150 的自然数)。总分最高的学生就是最厉害的,请输出最厉害的学生各项信息(姓名、各科成绩)。如果有多个总分相同的学生,输出靠前的那位。
思路
- 照题意排序
- 输出最厉害的学生
坑点
- 无
算法一:结构体+sort排序
实现步骤
- 照题意排序
- 输出最厉害的学生
代码
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct name{
string s;//姓名
int a,b,c;//语文 数学 英语
int sum=a+b+c;//总分
int d;//位置
}num[1005];
bool cmp(name m,name n)//结构体排序
{
if(m.sum!=n.sum)
{
return m.sum>n.sum;
}
else
{
return m.d<n.d;
}
}
int main()
{
int n;
cin>>n;
for (int i=0;i<n;i++)
{
cin>>num[i].s>>num[i].a>>num[i].b>>num[i].c;
num[i].sum =num[i].a+num[i].b+num[i].c;
num[i].d=i;
}
sort(num,num+n,cmp);
cout<<num[0].s<<" "<<num[0].a<<" "<<num[0].b<<" "<<num[0].c<< endl;
return 0;
}
总结
结构体基础题
P1678 烦恼的高考志愿
题意
现有 m所学校,每所学校预计分数线是 ai。有 nn 位学生,估分分别为 bi。根据 n位学生的估分情况,分别给每位学生推荐一所学校,要求学校的预计分数线和学生的估分相差最小(可高可低,毕竟是估分嘛),这个最小值为不满意度。求所有学生不满意度和的最小值。
思路
- 先用sort讲学校分数线由小到大排序
- 用二分计算出在那两个分数线之间
- 找出学生估分和学校分数线之前的差值比较大小
坑点
- 要考虑到比最低学校的分数线还低的情况
算法一:sort+二分
实现步骤
- 先用sort讲学校分数线由小到大排序
- 用二分计算出在那两个分数线之间
- 找出学生估分和学校分数线之前的差值比较大小
4.累加
代码
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int a[100005],b[100005];//定义两个数组,分别储存每个学校的分数线,和每个同学的估分
int main()
{
int n,m;//定义n,m
cin>>n>>m;
for(int i=1; i<=n; i++)
{
cin>>a[i];
}
for(int i=1; i<=m; i++)
{
cin>>b[i];
}
sort(a+1,a+n+1);//把每个学校的分数线从小到大排序
int sum=0;
for(int i=1; i<=m; i++)
{
int l=0,r=n+1;//定义左边界与右边界
while(l<r)
{
int mid=(l+r)/2;//取查找范围的中间值
if(a[mid]<=b[i])//如果录取分数线数组中的第mid个元素小于或等于那位同学的分数
{
l=mid+1;//左边界就往右移
}
else
{
r=mid;//右边界就往左移
}
}
if(b[i]<=a[1])
{
sum+=a[1]-b[i];
}
else
{
sum+=min(abs(a[l-1]-b[i]),abs(a[l]-b[i]));
}
}
cout<<sum;
return 0;
}
总结
基础二分