题目链接:点击打开链接
A: 给出Alena的课表, 1代表有课, 0代表没课, 2个连续0以上可以回家休息, 问你一天在学校待多久.
直接模拟即可, 可以直接计算1, 101的数目. 我记录了开头的1和结尾的1, 然后减去2个连续0以上的个数就是答案.
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int MAXN = 105;
int n, a[MAXN];
int main(int argc, char const *argv[])
{
scanf("%d", &n);
for(int i = 0; i < n; ++i)
scanf("%d", &a[i]);
int st = -1, ed = -1;
for(int i = 0; i < n; ++i) {
if(a[i] && st == -1) st = i;
if(a[i]) ed = i;
}
if(st == -1) {
printf("0\n");
return 0;
}
if(ed == -1) {
printf("1\n");
return 0;
}
int num = 0;
for(int i = st + 1; i < ed; ++i) {
if(!a[i]) {
int x = 1;
for(int j = i + 1; j < ed; ++j)
if(!a[j]) x++;
else break;
if(x == 1) continue;
else {
num += x;
i += x;
}
}
}
printf("%d\n", ed - st + 1 - num);
return 0;
}
B: 给你一个地图, 给出两点之间的距离, 问你从左上角到右下角再回左上角的最短路径(不能相同)是多少.
小小的脑洞, 记录n条路径的总长, 然后排序输出最短的两条和即可.
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int MAXN = 60;
int a1[MAXN], a2[MAXN], b[MAXN], n, ans, dis[MAXN];
int main(int argc, char const *argv[])
{
scanf("%d", &n);
for(int i = 1; i < n; ++i)
scanf("%d", &a1[i]);
for(int i = 1; i < n; ++i)
scanf("%d", &a2[i]);
for(int i = 1; i <= n; ++i)
scanf("%d", &b[i]);
for(int i = 1; i <= n; ++i) {
for(int j = 1; j < i; ++j)
dis[i] += a1[j];
for(int j = i; j <= n - 1; ++j)
dis[i] += a2[j];
dis[i] += b[i];
}
sort(dis + 1, dis + n + 1);
printf("%d\n", dis[1] + dis[2]);
return 0;
}
C: n个孩子去看牙医, 每个孩子有三个数据描述, 分别是诊断时发出的声音v, 无法承受他人声音时发出的声音d, 以及承受他人声音的
能力p. 当孩子诊断时, 后面一个人听到v - 1的声音, 再后面一个v - 2.. 如果超过自己的承受能力d, 就会向队尾跑去, 伴随着声音p, 同时
也可能会超过其他排队孩子的承受能力, 导致其他孩子跑去队尾.
还是模拟, 要注意用long long, 并且每个孩子听到声音后, 承受能力会减少听到的响应音量.
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int MAXN = 4005;
typedef long long ll;
int n, ans;
struct node
{
/* data */
ll v, d, p;
}a[MAXN];
int main(int argc, char const *argv[])
{
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
scanf("%lld%lld%lld", &a[i].v, &a[i].d, &a[i].p);
for(int i = 1; i <= n; ++i) {
if(a[i].p >= 0) {
ll e = 0;
for(int j = i + 1; j <= n; ++j)
if(a[j].p >= 0) {
a[j].p -= a[i].v + e;
if(a[j].p < 0) e += a[j].d;
if(a[i].v) a[i].v--;
}
ans++;
}
}
printf("%d\n", ans);
for(int i = 1; i <= n; ++i)
if(a[i].p >= 0) printf("%d ", i);
return 0;
}