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;
}
审题太重要了啊喂!