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

P7257 [COCI2009-2010#3] FILIP

题目链接

题意

给你两个十进制正整数 a,b,输出将这两个数翻转后的较大数

思路

  1. 翻转
  2. 比大小

坑点

算法一:

实现步骤
  1. 先将a和b翻转
  2. 比大小
代码
#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

实现步骤
  1. 翻转
  2. 取大值
代码
#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 列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。

思路

  1. *不变
  2. 计算?在3 × 3格子中 * 的数量
  3. 输出个数

坑点

算法一:数组

实现步骤
  1. *不变
  2. 计算?在33格子中的数量
  3. 输出个数
代码
#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 普及组] 表达式求值

题目链接

题意

给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。

思路

  1. 用到stl中栈的知识点

坑点

  1. 只要最后四位数

算法一:stl 栈

实现步骤
  1. 运用栈
  2. 遇到× 顶出栈 然后将结果重新压入栈
  3. 输出最后结果的最后四位
代码
#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 的自然数)。总分最高的学生就是最厉害的,请输出最厉害的学生各项信息(姓名、各科成绩)。如果有多个总分相同的学生,输出靠前的那位。

思路

  1. 照题意排序
  2. 输出最厉害的学生

坑点

算法一:结构体+sort排序

实现步骤
  1. 照题意排序
  2. 输出最厉害的学生
代码
#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位学生的估分情况,分别给每位学生推荐一所学校,要求学校的预计分数线和学生的估分相差最小(可高可低,毕竟是估分嘛),这个最小值为不满意度。求所有学生不满意度和的最小值。

思路

  1. 先用sort讲学校分数线由小到大排序
  2. 用二分计算出在那两个分数线之间
  3. 找出学生估分和学校分数线之前的差值比较大小

坑点

  1. 要考虑到比最低学校的分数线还低的情况

算法一:sort+二分

实现步骤
  1. 先用sort讲学校分数线由小到大排序
  2. 用二分计算出在那两个分数线之间
  3. 找出学生估分和学校分数线之前的差值比较大小
    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;
}

总结

基础二分

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值