16级C++第二次上机解题报告

来源:互联网 发布:网络bug是什么意思啊 编辑:程序博客网 时间:2024/06/15 03:07

A 自习室之神

时间限制:1000ms  内存限制:65536kb

通过率:125/179 (69.83%)   正确率:125/610 (20.49%)

题目描述

某位大神只要自习的时候,相邻座位有妹子,他就会拒绝在这个位置就坐。

新学期开始了,这位大神随意选择了一个时间进行穿越,走进了新主楼。他走进的这个教室只有一个小圆桌,圆桌周围均匀地摆着4个座位,编号1~4。给你这4个座位的状态,请你帮助判断他能否在这个教室里坐下。

输入

输入四个数,表示1~4号座位的状态。

0代表座位是空的,1代表座位上坐着男生,2代表座位上坐着女生。

输出

如果常朔荣可以坐下,输出"ConstSR is studying"

如果没有空座位,输出"ConstSR needs space"

如果有空座位但相邻位置有女生,输出"ConstSR hates girls"

输入样例1

0 0 1 0

输出样例1

ConstSR is studying

输入样例2

2 1 1 1

输出样例2

ConstSR needs space

输入样例3

0 2 2 0

输出样例3

ConstSR hates girls

 

 

 

 

考察知识点

条件判断语句的使用

解题思路

先判断是否有空座,只需判断是否有有数字0即可。

如果有空座,枚举空座,判断旁边是否有女生即可。

需要特别注意的是,这是一个圆桌,因此1号座位和4号座位是相邻的。

参考代码

#include<iostream>using namespace std;int main() {    int a, b, c, d;    cin >> a >> b >> c >> d;    if (a != 0 && b != 0 && c != 0 && d != 0)        cout << "ConstSR needs space";    else if (a == 0 && d != 2 && b != 2             || b == 0 && a != 2 && c != 2             || c == 0 && d != 2 && b != 2             || d == 0 && a != 2 && c != 2)        cout << "ConstSR is studying";    else        cout << "ConstSR hates girls";}




 

B 王助教猜数字

时间限制:1000ms  内存限制:65536kb

通过率:115/178 (64.61%)   正确率:115/826 (13.92%)

题目描述

王助教想要做一个猜数字游戏。首先规定一个要猜的数字,然后每猜一个数字,程序都会告诉他大了还是小了,最后如果王助教猜中了就胜利,没猜中就GG

输入

n行数据,每行一个数x,均为整数。
1≤n≤100
−2^31≤x≤2^31−1

多组数据读入,每组数据中:

第一行为要猜的数字。

第二行以后为王助教猜的数字。

当王助教猜中后,开始读入下一组数据。

输出

若王助教猜的数比实际小则输出"less than actual number"
比实际大则输出"greater than actual number" 
猜中则输出"you get the number {number}",其中{number}是要猜的数字。

输入样例

10

13

7

10

输出样例

greater than actual number

less than actual number

you get the number 10

 

考察知识点

条件判断语句的使用,读入语句返回值的判断

解题思路

  1. 先读入要猜的数,然后挨个读入猜的数,判断并输出。直到猜中或者读不到数据为止。
  2. 如果猜中,输出提示信息,读入下一个数作为要猜的数,然后挨个读入猜的数,直到再猜中或者读不到数据为止。
  3. 如果再猜中,继续执行步骤2

参考代码

#include<iostream>using namespace std;int main() {    int x, n;    while (cin >> x) {        while (cin >> n) {            if (n > x)                cout << "greater than actual number\n";            else if (n == x) {                cout << "you get the number "<< x << "\n";                break;            }            else if (n < x)                cout << "less than actual number\n";        }    }}


 

C 王助教坐地铁

时间限制:1000ms  内存限制:65536kb

通过率:30/144 (20.83%)   正确率:30/636 (4.72%)

题目描述

王助教是个路痴,以至于每次坐地铁都会坐过站。于是他打算做一个程序来提醒自己下地铁。

王助教总是希望自己少走路,但是他也希望自己能尽早到达目的地。假设地铁的运行轨迹是直线,现在由你来写一个这样的程序吧。

地铁站编号为1n

输入

第一行为一个整数x,表示目标地点距王助教的路程(按地铁线路计算)

第二行至第n行,每行一个整数Si,表示地铁走到下一站所走过的路程。

0≤x≤10000

0≤n≤1000000

1≤Si≤10000

输出

王助教应当在哪一站下地铁。

输入样例

100

15

90

10

输出样例

3

 

考察知识点

条件判断语句的使用,读入语句返回值的判断

解题思路

题意即:在所有站中,找到与目的地距离最近的一个站。

1.读入目的地的位置。此时已知位置信息的有起点站(编号为1的站)和目的地。用一个变量记录下起点站到目的地距离,此处设为minDist

2.读入一个距离,得到了第二个站的位置信息,据此求出第二个站到目的地的距离,设为nowDist。将nowDistminDist作对比,如果nowDist小于minDist,那么将nowDist作为新的minDist

3.重复执行步骤2,直到读不到数据时,输出minDist对应的站的序号。

参考代码

#include <iostream>using namespace std;int x, n, s, sum, minDist, nowDist, ans;int main() {    cin >> x;    sum = 0; //当前站离起点的距离    n = 1;//当前站的序号    minDist = x; //当前所有站中,与目的地最近的距离    ans = 1;//当前所有站中,与目的地最近的站的序号    while (cin >> s) {        n++;        sum += s;        nowDist = abs(sum - x); //当前站离目的地的距离        if (nowDist < minDist) {//如果当前站比之前的站都要近            minDist = nowDist; //更新minDist            ans = n;        }    }    cout << ans << "\n";}

三角形支架

时间限制: 1000 ms内存限制: 65536 kb

总通过人数: 110总提交人数: 159

题目描述

艺术创意中心要给即将到来的校庆嘉年华做一张大海报。由于这张海报实在是太大了,没这个尺寸的易拉宝。

于是创意中心决定自己设计一个支架。

假设这是一个实心均匀的三角形支架,但是如果它自己本身都放不稳,那就太糟糕了。

所以检查支架质量的任务就交给大家了。

底座不计质量。

像这种重心落在在底座外(落在顶点上不算)的,就会翻倒,本身是放不稳的。

输入

只有三个整数a,b,c分别为三角形的三个边,

a,b,cint范围内。

输出

三行数据。每行输出分别以a,b,c为底座,能否制作出稳定的三角形支架。若能则分为两种情况:
重心落在底座内部输出"stable"
重心落在底座的顶点上输出"almost stable"

否则输出"no way"。(不包含双引号)

输入样例1

2 3 4

输出样例1

2:stable

3:stable

4:stable

输入样例2

2 11 10

输出样例2

2:no way

11:stable

10:stable

hint

三角形已知三点重心公式:

x=(x1+x2+x3)/3

y=(y1+y2+y3)/3

 

考察知识点

计算几何,三角形组成判断,浮点精度问题,整数的表示范围

解题思路

这道题首先的思路是建系,算出交点以后,套入重心公式,然后判断是否落在底边上。

同时需要注意的是题目中只是要求设计支架,不一定做出来(可能无法构成三角形)

由于浮点数精度问题,一种办法是使用long double控制精度,然后将近似相等的绝对值判断中,精度调高来解决问题。

另外一种办法是放弃浮点数,改用乘法,使用整数来解决问题。

这里3a^2可以超过long long范围,需要使用unsigned long long.

参考代码

#include <cstdio>long long abs(long long a) {    return a > 0 ? a : -a;}void judge(long long a, long long b, long long c) {    if (a > 0 and b > 0 and c > 0 and c < a + b and c > abs(a - b)) {        long long gx3a2 = abs(c * c - b * b);        unsigned long long right = 3 * a * a;        if (gx3a2 < right)//这里,线段的等效表示范围为[-3a^2,3a^2],重心点等效表示为c^2-b^2。            printf("stable\n");        else if (gx3a2 == right)            printf("almost stable\n");        else            printf("no way\n");    } else        printf("no way\n");}int main() {    int a, b, c;    scanf("%d%d%d", &a, &b, &c);    printf("%d:", a);    judge(a, b, c);    printf("%d:", b);    judge(b, c, a);    printf("%d:", c);    judge(c, a, b);}


 

0 0