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

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值