记:第一次线上赛(一)

1. 点的位置

描述
判断一个点是否在两条直线之间。

平面直角坐标系上有两条直线y=ax+b和y=cx+d(其中a≠0,c≠0),还有一个点(e,f)。

如下图所示,如果点落在了两条直线之间的阴影区域(不包含点在直线上的情况),则称点在两条直线之间。
在这里插入图片描述

输入
六个整数a、b、c、d、e、f,含义见【描述】。其中a≠0,c≠0,六个数的绝对值均不会超过10000。

输出
如果点在直线之间,则输出Yes,否则输出No。

不要换行。

样例输入
1 0 -1 0 -2 0

样例输出
Yes

代码:

#include<iostream>
using namespace std;
int main()
{
	int a, b, c, d, e, f;
	cin >> a >> b >> c >> d >>e>> f;
	if (e * a + b > f && c * e + d<f || e * c + d>f && e * a + b < f)
		cout << "Yes";
	else
		cout << "No";
	return 0;
}

分析:判断点对应的函数值是否在两条直线之间
由于不知两条直线的斜率,故需要分两种情况;其他情况则一律输出“No"。

2.谁比较好

描述
在一次测验中总共有60道题目。有一位判题老师给分的形式很特殊,他会用一个60位的二进制数来表示某位同学的分数,例如,小明同学只做出了最后三道题,那么他的得分就是000000000000000000000000000000000000000000000000000000000111,但是老师觉得这样写太麻烦了,于是决定把这个分数转换成十进制的形式,所以小明同学最后的得分就是7。现在给你Alice和Bob的十进制分数,如果Alice做出了Bob没做出的题目,那么Alice就比Bob好,反之Bob就比Alice好;如果他们两个做出的题目完全相同,则他们都很好,如果他们都做出了对方没有做出的题,那么我们就无法判断谁更好。

输入
两个整数 a 和 b 分别代表Alice的分数和Bob的分数,保证这两个整数都能一定可以化成60位的二进制数。

输出
如果Alice做出了Bob没做出的题目,则输出Alice good。

如果Bob做出了Alice没做出的题目,则输出Bob good。

如果他们两个做出的题目完全相同,则输出both good。

如果他们都做出了对方没有做出的题,则输出no response。

最后不需要换行。

样例输入
13 5
样例输出
Alice good

HINT
13的二进制为1101,5的二进制为101。

分析:利用位运算来分情况讨论。

代码:

#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
	ll a, b;
	cin >> a >> b;
	if (((a|b)==a)&&((a|b)==b))
	{
		cout << "both good";
	}
	else if ((a | b )== a)
	{
		cout << "Alice good";
	}
	else if ((a | b) == b)
	{
		cout << "Bob good";
	}
	else
	{
		cout << "no response";
	}
	return 0;
}

3. 反向输出四位数

时间限制: 1 S | 内存限制: 8192 KB

描述
把一个四位正整数反向输出

输入
一个四位正整数

输出
反向输出这个四位数,也就是个位数、十位数、百位数、千位数的顺序。不用管反向后是否0开头的问题。

不要换行。

样例输入
1280

样例输出
0821

代码:

#include<iostream>
using namespace std;
int main()
{
	int m,a,b,c,d;
	cin >> m;
	a = m % 10;
	b = m / 10 % 10;
	c = m / 100 % 10;
	d = m / 1000 % 10;
	cout << a << b << c << d;
	return 0;
}

总结:输出一个数的某位数字的通项公式
如个位:m/1%10;
十位:m/10%10;
百位:m/100%10;

n位:m/(pow(10,n-1))%10
(都是对10取模)

4. 等差数列

时间限制: 1 S | 内存限制: 8192 KB

描述
已知一个等差数列第a项的值是b,第c项的值是d,输出该数列第n项的值

输入
五个整数a、b、c、d、n,含义见【描述】(a>0, c>0, n>0, a≠c)。

保证数列的每一项都是整数。

输出
一个整数,表示第n项数列的值。

不要换行。

样例输入
2 3 3 5 4

样例输出
7

代码:

#include<iostream>
using namespace std;
int main()
{
	int a, b, c, d, n, s, a1;//s为公差,a1为首项
		cin >> a >> b >> c >> d >> n;
	if (a < c)//数列递增
	{
		s = (d - b) / (c - a);
	}
	else//数列递减
	{
		s = (b- d) / (a - c);
	}
	a1 = b - (a - 1) * s;
	cout << a1 + (n - 1) * s;
	return 0;
}

总结:错误点:由于a与c的大小关系未知,因此需要分两种情况考虑;而当a>c时,计算公差时,对应的项需要相应发的生变化!(还是细节问题)

5.取数游戏

描述
Alice和Bob在玩一个游戏:有四个整数 a、b、c、d 排成一排,他们每次只能从最左端或最右端取一个数字,Alice总是先手,最后谁取得的两个数字之和更大,谁就获得游戏的胜利,Alice和Bob都不想输给对方,所以他们总是会采取最佳的策略。

输入
四个整数a、b、c、d,输入的顺序就是排列的顺序,即a在最左端,d在最右端。(1 <= a、b、c、d <= 100)

输出
胜者的名字,如果平局则输出GG。

不要换行。

样例输入
3 5 2 1

样例输出
Alice

HINT
在案例中,Alice先拿1,此时无论Bob拿3还是拿2,Alice都能拿到5。

做出这题的同学想一下,如果是n个数字的话胜负关系又是如何的呢?

分析:由于只有4张牌,所以采取了较为偷懒的写法。

大致上按照Alice第一次选取的是 第一张牌 还是 第四张牌 小小分类一下;
接着依次按照Bob和Alice每一步会选取的牌(Bob必定选择头、尾中较大的那张牌),写出所有的情况。之后再对比两种情况,看哪种是对于Alice是更有利的。如果有能赢的情况,就输出"Alice";若两种都是平局,就欢声笑语中打出"GG"。

代码:

#include<iostream>
using namespace std;
int main()
{
	int a, b, c, d;
	cin >> a >> b >> c >> d;
	int ansa1 = 0, ansb1 = 0;
	if (d > b)//A第一步选a,B会选b和d中最大的
	{
		ansa1 += a;
		ansb1 += d;
		if (b > c)
		{
			ansa1 += b;
			ansb1 += c;
		}
		else
		{
			ansa1 += c;
			ansb1 += b;
		}
	}
	else//b>d
	{
		ansa1 += a;
		ansb1 += b;
		if (c > d)
		{
			ansa1 += c;
			ansb1 += d;
		}
		else
		{
			ansa1 += d;
			ansb1 += c;
		}
	}
	int ansa2 = 0, ansb2 = 0;
	ansa2 += d;//a第一步选d
	if (a > c)
	{
		ansb2 += a;
		if (b > c)
		{
			ansa2 += b;
			ansb2 += c;
		}
		else
		{
			ansa2 += c;
			ansb2 += b;
		}
	}
	else//c>=a
	{
		ansb2 += c;
		if (a > b)
		{
			ansa2 += a;
			ansb2 += b;
		}
		else
		{
			ansa2 += b;
			ansb2 += a;
		}
	}
	if (ansa1 > ansb1 || ansa2 > ansb2)
	{
		cout << "Alice";
	}
	else
	{
		cout << "GG";
	}
	return 0;
}

6. 除法

描述
按照小学数学的写法输出两个数相除的结果。能除得尽的时候输出商,除不尽的时候输出商和余数。

例如42/6=7,43/6=7…1

商和余数之间是6个小数点字符。

输入
两个正整数a和b。

输出
如果a除以b没有余数,那么输出a/b=c,其中a和b用具体数字代替,c是a除以b的商。

如果a除以b有余数,那么输出a/b=c…d,其中a和b用具体数字代替,c是a除以b的商,d是a除以b的余数,c和d之间是6个小数点字符。

不要换行。

样例输入
43 6

样例输出
43/6=7…1

分析:注意题目要求的格式:要求输出的是一个等式或者带余数的式子,而不是一个数!

代码:

            
#include<iostream>
using namespace std;
int main()
{
	int a, b;
	cin >> a >> b;
	if (a % b == 0)
		cout << a << "/" << b << "=" << a / b;
	else
		cout << a << "/" << b << "=" <<a/b<< "......" << a % b;

	return 0;
}        

审题太重要了啊喂!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值