STA15首测-题解

//此文供以STA同学理解首次测试题目使用,其他大牛自行忽略。
此次的题目都是很基础的模板题,简单发一下题解。

问题 A: 动感的波波
时间限制: 1 Sec 内存限制: 128 MB

题目描述
波波是茅坡村最帅的男人,他走路的时候身后的动感光波是菱形的,菱形的高是波波的心情指数,我们假设他的心情指数可以由一个正奇数n(0 < n < 150)来表示。

现在请你来为波波打印出他当前心情指数下,身后的动感光波!
输入
一个正奇数,波波的心情指数 n。
输出
波波背后菱形的动感光波。
样例输入

3

样例输出

 *
***
 *

打印菱形,在已全是水题的基础上,被逼着加的更水的题。
没有题解,应该也不需要题解吧。

问题 B: 不和谐的弯弯学姐
时间限制: 1 Sec 内存限制: 64 MB

题目描述
众所周知,大STA里有一个自称为“正直善良机智学长”的弯弯学姐。
这位学姐一点也不和谐,平时最爱看人互相撕逼,直到有一天自己被人打了一顿。
鼻青脸肿的弯弯学姐决定通过和东区野猫pk来提升自己的撕逼战斗力。
现在告诉你一连串学姐pk的结果,请你分别按照10分制与15分制来帮学姐统计一下她(他?它!?)的比分。
由于学姐精力有限,她总pk次数不会超过1000。
10分制是指双方任意一方胜利次数达到10便记为一场,15分同理。
在统计以10分制或15分制统计之后,总数并不一定只有一场,有多少场便输出多少场的统计结果。
最后剩下的部分不一定能够凑齐10或15场胜利,直接输出这局部的结果。
例如输入1 1 0
输出
2:1
2:1
输入
一串0和1,数字间用空格隔开,0代表学姐输了,1代表学姐赢了。
输出
首先输出按照10分制统计的结果,左边是学姐赢的次数,右边是猫的,形式如 10:1 ,每局结果一行,不足一局按一局输出。
然后输出按照15分制统计的结果,每局结果一行,不足一局按一局输出。

样例输入

0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 1 1 1 1 0 0 0 1 1 1 0 0 1 1

样例输出

10:9
9:8
14:15
5:2

10分制:获取输入后统计输赢,输或赢其中任意一个达到10便输出,然后继续统计,统计到末尾如果输赢任意一个不为0,就输出。15分制同理。

问题 C: 爱学习的小老头
时间限制: 1 Sec 内存限制: 128 MB

题目描述
一天,爱学习的小老头赶在宿舍熄灯前往宿舍走。走在途中,他突然很想知道,这个时候家属楼有多少户人没有睡觉呢?他决定通过观察家属楼亮灯的窗户来估计。
小老头看到的家属楼有n层,每层有2m个窗户。在每层上,有编号1~m户人,两个连贯的窗户对应着一户人家。如果我们从左到右依次编号窗户为1到2m的话,那么就有在第i层的第j户人家对应的窗户为对应着当前层编号为2j - 1和2j的窗户。我们规定一户人家只要有一盏灯亮着,那么就认为该户人家还没有睡觉。
根据给出的窗户和楼层的信息,请你帮小老头计算一下还没有睡的人家。
输入
第一行输入两个整数n和m(1 <= n,m <= 100),分别是大楼的层数和每层的户数。接下来n行描述了从底层开始到顶层的情况,每行包括2*m个字符,如果第i个窗户是亮着的,字符为’1’,否则为’0’。

输出
打印出没有睡的人家的户数。

样例输入

2 2
0 0 0 1
1 0 1 1

样例输出

3

提示

如果还有疑问,那么再给出一组样例:

输入:

1 3

1 1 0 1 0 0

输出:

2

这道题,输入n和m后,直接循环nxm次,每次输入2个数,其中任意一个为1就把结果加一,最后输出结果就可以了。

问题 D: 英文捉鸡的然然
时间限制: 1 Sec 内存限制: 128 MB
]
题目描述
然然的英文捉鸡,每次在acm读题时总会被歪果仁甩得很远,于是机智的他想到一个一点都不机智的方法来帮助自己学习英文。
每次遇到一篇英文文章,他在学完文章中所有生词后将文章的所有的单词记下来以备以后复习。每天,他会统计当天自己记下的所有单词中各个字母出现的次数,如果出现最多的字母所出现的次数,减去出现最少(但必须出现过)的字母所出现的次数,所得差是一个质数,那么然然今天就会很开心,否则他就会非常沮丧(我也不知道他这是什么诡异心态)。
然然的爸比想请你帮忙,写一个程序来判断当天然然的心情。
输入
一篇英文文章(理所应当的有空格)。长度在100000以内,单个单词长度不超过100。
输出
然然今天的心情。心情好的话输出“Happy”,心情不好的话输出“Sad”。
样例输入

error

样例输出

Happy

提示

不区分大小写(即出现同一个字母的大小写时,不分开统计)

根据题中提示不难得出应该按照单词来输入,直到文件尾结束。
那么输入一个单词后,统计其中各个字符出现次数存起来,注意,不区分大小写,也就是说无论是大写A还是小写a,都是增加a的出现次数。
最后将26个字母的出现次数遍历一下,找到不为0的最小值,以及最大值,求出差,判素数。

问题 E: 爱游戏的招财猫
时间限制: 1 Sec 内存限制: 64 MB

题目描述
招财猫正在玩一个游戏,他向他的所有联系人发一条短信“这里是来自xxx的问候。”,收到这条短信的人会将其原封不动地转发给自己通讯录里的所有人。
如果招财猫最后也收到自己这条短信,那么招财猫会很开心

现在给你N个人和他们各自的通讯录都有谁,问如果编号为i的人玩这个游戏,他最后会收到源自自己的短信么?(1<=i<=N)

通讯录是单向的。(招财猫的通讯录里有你,但你的通讯录里不一定有招财猫)
输入
第一行给定两个整数N,M,表示N个人,M种关系( N<=1000)
接下来M行, 每行两个整数a和b,表示a的通讯录里有b。1<=a,b<=N。(保证a!=b)
输出
一共N行,每行一个字符T或F 。第 i 行表示编号为i的人是否收到了源自自己发出的短信 ,如果收到了,就输出T,反之输出F。
样例输入

3 3
1 2
2 3
3 1

样例输出

T
T
T

这个类型的题的做法很多,由于给的数据很小,所以可以用DFS或者BFS做,这是用课内知识的基本做法,但是最稳定的方法是floyd传递闭包,感兴趣的可以查一下。

问题 F: 考驾照的幸芝哥哥
时间限制: 1 Sec 内存限制: 128 MB

题目描述
幸芝哥哥最近忙着考驾照,科目二中,她考完倒车入库后准备开向上坡起步的考试场所,这时考场中神奇的出现了很多挡路的大石头!而这次神奇的考试又规定在两个考试的期间逗留时间不能过长,所以幸芝哥哥非常着急,决定找到一条最近的一条道路绕过石头们到达考试场所,她想请你帮帮忙

定义一个二维数组:
int maze[5][5] = {

0, 0, 0, 0, 0,

0, 1, 1, 1, 0,

0, 1, 1, 1, 0,

0, 1, 0, 0, 0,

0, 0, 0, 1, 0,

};

它表示一个从幸芝哥哥现在的位置到上坡起步的考场之间的道路,其中的1表示大石头,0表示可以走的路,左上角(0,0)位置表示起点,右下角(4,4)位置代表上坡起步的考试终点。只能横着走或竖着走,不能斜着走,要求编程序找出幸芝哥哥渴望走的最短的路线。
输入
一个5 × 5的二维数组,表示道路。数据保证有唯一解。
输出
左上角到右下角的最短路径,格式如样例所示。
样例输入

0 0 0 0 0
0 1 1 1 0
0 1 1 1 0
0 1 0 0 0
0 0 0 1 0

样例输出

(0, 0)
(0, 1)
(0, 2)
(0, 3)
(0, 4)
(1, 4)
(2, 4)
(3, 4)
(4, 4)

迷宫问题BFS无疑,保留路径。

问题 G: 任性的主持人学姐
时间限制: 1 Sec 内存限制: 128 MB

题目描述
STA纳新宣讲会的主持人学姐可谓是实实在在地火了一把,这其中还有一个不为人知的小故事。

话说宣讲会那天,主持人学姐为了让最后排的同学都能看到自己,打算让自己站地更高。她从卓越班库房里找到了很多型号的木头箱子,这些箱子有着自己的三维(长宽高),且每种型号的箱子数量不限。学姐打算用这些箱子给自己搭一个立脚之地。然而为了整个搭建出来的结构稳定,并且学姐要有地方踩着上去,位于下面的箱子的长与宽都必须大于位于其上方的箱子的长与宽,这意味着两个相同的箱子,直接放置在一起是不可行的!需要注意的是,箱子可以旋转90度!

现在学姐给出了所有型号箱子的数据,想请机智的你帮她算算,她最多到底能站多高?
输入
第一行有一个整数n,表示有n种箱子。(n<=30)

接下来n行,每行三个整数x,y,z,分别代表这n种箱子的长宽高数据。
输出
最高能达到的高度。

样例输入

5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27

样例输出

342

提示

请注意箱子能随意旋转90度后放置。

这道题用到的知识对于大家来说难一点,是动态规划。
就是个垒箱子的题,而且箱子的长宽高是能互换的。
所以每次输入一个箱子的数据时,分别以x,y,z为高存三个数据到箱子数据组里。
然后h[i]表示以第i个箱子数据为最高的箱子,所能达到的最高高度。
s是长宽能容纳第i个箱子数据的箱子。
那么动态方程就是h[i]=max(h[i],h[s]+h[i])。
数据比较水,n最大不超过30,所以n^2都能过。
给一下代码吧。

//
// main.cpp
// sta15-test
//
// Created by 袁子涵 on 15/11/28.
// Copyright © 2015年 袁子涵. All rights reserved.
//

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <cmath>

using namespace::std;

typedef struct blocks
{
    int x,y,z;
}Blocks;

Blocks s[120];
int n,h[120];
bool visit[120];

int dp(int num)
{
    if (visit[num]) {
        return h[num];
    }
    int x=s[num].x,y=s[num].y,z=s[num].z;
    h[num]=z;
    for (int i=1; i<=3*n; i++) {
        if ((x<s[i].x && y<s[i].y) || (x<s[i].y && y<s[i].x)) {
            h[num]=max(h[num],dp(i)+z);
        }
    }
    visit[num]=1;
    return h[num];
}

int main(int argc, const char * argv[]) {
    int x,y,z,out,t=0;
    while (scanf("%d",&n)!=EOF && n!=0) {
        t++;
        out=0;
        for (int i=1; i<=3*n; i+=3) {
            scanf("%d%d%d",&x,&y,&z);
            s[i].x=x;s[i].y=y;s[i].z=z;
            s[i+1].x=x;s[i+1].y=z;s[i+1].z=y;
            s[i+2].x=y;s[i+2].y=z;s[i+2].z=x;
        }
        memset(h, 0, sizeof(h));
        memset(visit, 0, sizeof(visit));
        for (int i=1; i<=3*n; i++) {
            out=max(out,dp(i));
        }
        printf("%d\n",out);
    }
    return 0;
}

问题 H: 尽职的光光男神
时间限制: 1 Sec 内存限制: 128 MB

题目描述
随着STA新成员的加入,光光男神想着是不是让大家通过一次野餐或聚会来增进各自之间的感情。
现在问题来了,大家平时都说自己很忙,只能在周末抽出一天来聚餐,而男神想让大家去一个离学校较远的地方玩儿,所以男神必须想办法让大家能够在来回的路途上少花些时间。
现在已知有N个车站,我们学校所处的位置记为1号车站,而要去的地方在N号车站,现给出车站间的路径情况和这条路消耗的时间,求从学校到目标地点所需的最少时间。
输入
第一行两个整数 T和N,代表着有T条路径,N个车站。
第2~T+1行,每行分别有3个以空格隔开的整数,a、b、time,表示a号车站到b号车站间有一条要消耗time时长的路。T<=2000,N<=1000,1<=time<=100.
输出
从1号车站到N号车站所要消耗的最少时间。
样例输入

5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100

样例输出

90

提示

路径是双向的。

车站与车站之间可能不仅仅只有一条直接路径哦。

样例中,途径1,2,3,4是最短路径。

最短路问题,直接一次dijkstra算法就出来了。这里贴一个用优先队列优化的。

//
// main.cpp
// sta15-test
//
// Created by 袁子涵 on 15/11/28.
// Copyright © 2015年 袁子涵. All rights reserved.
//

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
#include <vector>
#include <queue>
#define MAXN 1010
#define typec long long int
#define INF 0x3f3f3f3f

using namespace std;
int T,N;
struct qnode
{
    int v,c;
    qnode(int _v=0,int _c=0):v(_v),c(_c){}
    bool operator <(const qnode &r)const
    {
        return c>r.c;
    }
};
struct Edge
{
    int v,cost;
    Edge(int _v=0,int _cost=0):v(_v),cost(_cost){}
};
vector<Edge>E[MAXN];
bool vis[MAXN];
int dist[MAXN];
void Dijkstra(int start)
{
    memset(vis, 0, sizeof(vis));
    for (int i=1; i<=N; i++)
        dist[i]=INF;
    priority_queue<qnode>que;
    while (!que.empty())
        que.pop();
    dist[start]=0;
    que.push(qnode(start,0));
    qnode tmp;
    while (!que.empty()) {
        tmp=que.top();
        que.pop();
        int u=tmp.v;
        if (vis[u])
            continue;
        vis[u]=1;
        for (int i=0; i<E[u].size(); i++) {
            int v=E[tmp.v][i].v;
            int cost=E[u][i].cost;
            if (!vis[v]&&dist[v]>dist[u]+cost) {
                dist[v]=dist[u]+cost;
                que.push(qnode(v,dist[v]));
            }
        }
    }
}
void addedge(int u,int v,int w)
{
    E[u].push_back(Edge(v,w));
}

int main(int argc, const char * argv[]) {
    int a,b,c;
    scanf("%d%d",&T,&N);
    for (int i=0; i<=N+1; i++)
        E[i].clear();
    for (int i=1; i<=T; i++) {
        scanf("%d%d%d",&a,&b,&c);
        addedge(a,b,c);
        addedge(b, a, c);
    }
    Dijkstra(N);
    printf("%d\n",dist[1]);
    return 0;
}

你可能感兴趣的:(c)