SUST_ACM_2019届暑期ACM集训热身赛题解
问题A:Hello SUST!
知识点:基本输入输出
C/C++:
#include <stdio.h>
int main() {
int n;
scanf("%d", &n);
while(n --) {
printf("Hello SUST!\n");
}
return ;
}
问题B:计算A+B
知识点:基本输入输出
C/C++:
#include <cstdio>
int main() {
int a, b;
while(~scanf("%d %d", &a, &b)) {
printf("%d\n", a + b);
}
return ;
}
问题C:
知识点:基本输入输出
C/C++:
#include <cstdio>
int main() {
int n;
while(scanf("%d", &n) && n) {
printf("%d\n", n * (n + ) / );
}
return ;
}
问题D:
知识点:递推
C/C++:
#include <cstdio>
using namespace std; const int maxn = + ;
typedef long long ll;
ll ans[maxn];
int t, n; int main() {
ans[] = ans[] = ;
for(int i = ; i < maxn; i ++) {
ans[i] = ans[i - ] + ans[i - ];
}
scanf("%d", &t);
while(t --) {
scanf("%d", &n);
printf("%lld\n", ans[n]);
}
return ;
}
问题E:
知识点:排序
C/C++:
#include <cstdio>
#include <algorithm>
using namespace std; const int maxn = + ;
double score[maxn]; bool cmp(const double &a, const double &b) {
return a > b;
} int main() {
int t, n, m;
scanf("%d", &t);
while(t --) {
scanf("%d %d", &n, &m);
for(int i = ; i < n; i ++) scanf("%lf", &score[i]);
// sort(score, score + n, cmp);//可用冒泡排序代替
// /*
for(int i = ; i < n - ; i ++) {
for(int j = ; j < n - - i; j ++) {
if(score[j + ] > score[j]) {
double temp = score[j];
score[j] = score[j + ];
score[j + ] = temp;
}
}
}
// */
double ans = 0.0;
for(int i = ; i < m; i ++) {
ans += score[i];
}
printf("%.2f\n", ans / m * 1.0);
}
return ;
}
问题F:
知识点:循环语句和判断语句
C/C++:
#include <cstdio>
#include <cstring>
using namespace std; char G[][];
bool ans; int main() {
int t, flag;
scanf("%d", &t);
while(t --) {
ans = false;
for(int i = ; i < ; i ++) {
scanf("%s", G[i]);
}
if((G[][] == '' && G[][] == '' && G[][] == '') || (G[][] == '' && G[][] == '' && G[][] == ''))
ans = true;//检查斜向true
if(!ans) {
for(int i = ; i < ; i ++) {
flag = ;
for(int j = ; j < ; j ++) {
if(G[i][j] == '') flag ++;
}
if(flag == ) {
ans = true;
break;
}//检查横向
flag = ;
for(int j = ; j < ; j ++) {
if(G[j][i] == '') flag ++;
}//检查纵向
if(flag == ) {
ans = true;
break;
}
}
}
if(ans) printf("Yes\n");
else printf("No\n");
}
return ;
}
问题G:
知识点:字符串存储
C/C++:
#include <cstdio>
#include <cstring>
using namespace std; char str[][] = {
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"
}; int main() {
int n;
while(scanf("%d", &n) && n) {
if(n <= )
printf("%s\n", str[n - ]);
}
return ;
}
问题H:
知识点:循环语句
C/C++:
#include <cstdio>
#include <cstring>
using namespace std; const int maxn = ;
int value[] = {, , , };
bool vis[maxn]; int main() {
int n;
for(int i = ; i <= ; i ++) {
for(int j = ; j <= ; j ++) {
for(int k = ; k <= ; k ++) {
for(int p = ; p <= ; p ++) {
vis[i * value[] + j * value[] + k * value[] + p * value[]] = true;
}
}
}
}
while(scanf("%d", &n) && n) {
if(vis[n]) printf("Y\n");
else printf("N\n");
}
return ;
}
问题I:
知识点:题目要判断三维空间内四个点是否共面,则只需知道由四个点组成的三个向量是否共面即可知道答案。
我们知道两个向量a, b, 的向量积等于垂直于他们所在平面的空间向量c,如果c与另一个向量d垂直,那我们就可以证明a,b,c三向量共面。
我们可以利用矩阵(行列式)计算出c向量,再与d进行点乘,判定结果是否为零即可(两向量平行,内积为零)。
C/C++:
#include <cstdio>
#include <cstdlib>
using namespace std; struct node{
int x, y, z;
} a[], b[]; bool plane() {
bool ret = false;
if(b[].x * (b[].y * b[].z - b[].z * b[].y) - b[].x * (b[].y * b[].z - b[].z * b[].y) + b[].x * (b[].y * b[].z - b[].z * b[].y) == )
ret = true;
return ret;
} int main()
{
int T, day = ;
scanf("%d", &T);
while(T--) {
for(int i = ; i < ; i ++) {
scanf("%d %d %d", &a[i].x, &a[i].y, &a[i].z);
}
for(int i = ; i < ; i ++) {
b[i].x = a[i + ].x - a[i].x;
b[i].y = a[i + ].y - a[i].y;
b[i].z = a[i + ].z - a[i].z;
}
if(plane())
printf("Day #%d: Yes\n", day);
else
printf("Day #%d: No\n", day);
day ++;
}
return ;
}
问题J:
题意:
从L走到C的最短路dist是否小于k?小于k的话从L到C路径长度等于dist的不全重复的路径有几条?
思路:
由于DFS求解最短路之缓慢,所以我们可以先用BFS算出最短路,判断可行之后再用DFS求出满足条件的条数即可。在执行DFS时,我们先从起点出发,任意选择其中一条路并且一直走到不满足题解的状态时我们回退到上一个可以继续往前走的状态继续往前走,往前走的时候记得标记走过的路,往回走的时候记得取消标记,这样可以保证所有路都被找到并且没有重复,实现起来也比较简便。
C/C++:
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std; typedef pair<int, int> pii;
const int maxn = 1e3 + ;
int n, m, k, step, ans, Dist;
char G[maxn][maxn];
int dist[maxn][maxn];
bool vis[maxn][maxn];
pii B, E, now, Next;
/*
这里的pair完全可以用结构体代替 pair<int, int> 可以看作是一个类似于结构体的寄存器
比如 struct P {
int first, second;
}now;
可以用now.first, now.second访问这个变量的两个值。
也可以申明pair<int, int>类型的数组,也就相当于struct P array[size];
*/
int bfs(int x, int y) {
memset(vis, false, sizeof vis);
memset(dist, , sizeof dist);
queue <pii> Q;
Q.push(make_pair(x, y));
dist[x][y] = ;
while(!Q.empty()) {
pii now = Q.front();
Q.pop();
if(now.first == E.first && now.second == E.second) return dist[now.first][now.second];
for(int dx = -; dx <= ; dx ++) {
for(int dy = -; dy <= ; dy ++) {
if(abs(dx - dy) == ) {
Next.first = now.first + dx;
Next.second = now.second + dy;
if(!vis[Next.first][Next.second] && Next.first >= && Next.first < n && Next.second >= && Next.second < m && G[Next.first][Next.second] != '#') {
dist[Next.first][Next.second] = dist[now.first][now.second] + ;
Q.push(make_pair(Next.first, Next.second));
vis[Next.first][Next.second] = true;
}
}
}
}
}
return -;
} void dfs(pii B, pii E, int D) {
if(B.first == E.first && B.second == E.second) {
if(D == ans) step ++;//如果当前访问的结点为终点且到起点的距离为最短路则step++
}
if(D > ans) return;//如果当前路径在D步内不能到达终点则回退,换下一条路
for(int i = -; i <= ; i ++) {
for(int j = -; j <= ; j ++) {
if(abs(i - j) == ) {//由于只能从上下左右四个方向走,所以可以找出这样的关系式,读者可以自行在草稿纸上进行验证
if(B.first + i >= && B.first + i < n && B.second + j >= && B.second + j < m) {//不越界
if(G[B.first + i][B.second + j] != '#' && !vis[B.first + i][B.second + j]) {//判断是否没有访问过且不为石头
vis[B.first + i][B.second + j] = true;
dfs(make_pair(B.first + i, B.second + j), E, D + );//递归走下一步
vis[B.first + i][B.second + j] = false;//记得修复状态
}
}
}
}
}
} int main() {
int t, Case = ;
scanf("%d", &t);
while(t --) {
step = ;
Dist = 0x3f3f3f3f;
scanf("%d %d %d", &n, &m, &k);
for(int i = ; i < n; i ++) scanf("%s", G[i]);
for(int i = ; i < n; i ++) {
for(int j = ; j < m; j ++) {
if(G[i][j] == 'L') B = make_pair(i, j);
if(G[i][j] == 'C') E = make_pair(i, j);
}
}
ans = bfs(B.first, B.second);
if(ans > k) ans = -;
printf("Case #%d: %d ", ++Case, ans);
if(ans != -) {
memset(vis, false, sizeof vis);
dfs(B, E, );
printf("%d", step);
}
printf("\n");
}
return ;
}
SUST_ACM_2019届暑期ACM集训热身赛题解的更多相关文章
- 暑期ACM集训
2019-07-17 08:42:11 这是总结昨天的做题情况 总体来说,好久的没做题了,实力下降了许多,这一个月假又学习吧!!!! A - Ropewalkers Polycarp decided ...
- 牛客网暑期ACM多校训练营(第四场):A Ternary String(欧拉降幂)
链接:牛客网暑期ACM多校训练营(第四场):A Ternary String 题意:给出一段数列 s,只包含 0.1.2 三种数.每秒在每个 2 后面会插入一个 1 ,每个 1 后面会插入一个 0,之 ...
- 牛客网暑期ACM多校训练营(第五场):F - take
链接:牛客网暑期ACM多校训练营(第五场):F - take 题意: Kanade有n个盒子,第i个盒子有p [i]概率有一个d [i]大小的钻石. 起初,Kanade有一颗0号钻石.她将从第1到第n ...
- 牛客网 暑期ACM多校训练营(第一场)A.Monotonic Matrix-矩阵转化为格子路径的非降路径计数,Lindström-Gessel-Viennot引理-组合数学
牛客网暑期ACM多校训练营(第一场) A.Monotonic Matrix 这个题就是给你一个n*m的矩阵,往里面填{0,1,2}这三种数,要求是Ai,j⩽Ai+1,j,Ai,j⩽Ai,j+1 ,问你 ...
- 洛谷NOIp热身赛题解
洛谷NOIp热身赛题解 A 最大差值 简单树状数组,维护区间和.区间平方和,方差按照给的公式算就行了 #include<bits/stdc++.h> #define il inline # ...
- 牛客网 暑期ACM多校训练营(第二场)A.run-动态规划 or 递推?
牛客网暑期ACM多校训练营(第二场) 水博客. A.run 题意就是一个人一秒可以走1步或者跑K步,不能连续跑2秒,他从0开始移动,移动到[L,R]的某一点就可以结束.问一共有多少种移动的方式. 个人 ...
- yzm10的ACM集训小感
7月30号,ACM集训进行了两周,一切都已on the right way.这时的我适时地从题海中探出头,其实除了刷题,也该写点什么来总结下过去.首先,在第一周里,我学习了数据结构,知道了STL这么一 ...
- 牛客网暑期ACM多校训练营(第三场)H Diff-prime Pairs (贡献)
牛客网暑期ACM多校训练营(第三场)H Diff-prime Pairs (贡献) 链接:https://ac.nowcoder.com/acm/contest/141/H来源:牛客网 Eddy ha ...
- 2018牛客网暑期ACM多校训练营(第二场)I- car ( 思维)
2018牛客网暑期ACM多校训练营(第二场)I- car 链接:https://ac.nowcoder.com/acm/contest/140/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 ...
随机推荐
- 双层for循环用java中的stream流来实现
//双重for循环for (int i = 0; i < fusRecomConfigDOList.size(); i++) { for (int j = 0; j < fusRecomC ...
- 0-4评价一个语言模型Evaluating Language Models:Perplexity
有了一个语言模型,就要判断这个模型的好坏. 现在假设: 我们有一些测试数据,test data.测试数据中有m个句子;s1,s2,s3-,sm 我们可以查看在某个模型下面的概率: 我们也知道,如果计算 ...
- Linux学习-FTP服务
一.FTP相关介绍 1.文本传输协议FTP FTP (File Transfer Protocol) 文件传输协议,是因特网中使用最广泛的文件传输协议: 基于C/S结构的双通道协议(数据和命令连接) ...
- 使用mongodb
1.安装 yarn add moogose 2.启动 在命令行 mongod --dbpath D:\data//这是最后出现 waiting for connections on port 2701 ...
- 【bzoj2064】【分裂】状态压缩表示合并子集
(上不了p站我要死了,画师当然是wlop大大啦) 感觉这个做法还是挺难想的. 但还是总结一下思路吧.. "只可意会不可言传的状压dp"(乱说) Description 背景: 和久 ...
- [NOI2003]逃学的小孩 题解
前言 >原题传送门(洛谷)< 看了一下洛谷题面,这道NOI的题竟然是蓝的(恶评?),做了一下好像确实是蓝的... 解法 思路非常简单,找道树的直径,然后答案是直径长度加上最大的min(di ...
- Ubuntu 16.04下使用docker部署rabbitmq
(以下docker相关的命令,需要在root用户环境下或通过sudo提升权限来进行操作.) 1.拉取rabbimq镜像到本地 docker pull rabbitmq 2. Docker运行rabbi ...
- 详细讲解Android中的AbsListView的源码
不知道各位童鞋们在开发的过程中有没有感兴趣过ListView是如何实现的呢?其实本身ListView的父类AbsListView才是关键,但是如果大家看过源码的话,会发现AbsListView将近70 ...
- [CSP-S模拟测试]:炼金术士的疑惑(模拟+数学+高斯消元)
题目传送门(内部题70) 输入格式 第一行一个正整数$n$,表示炼金术士已知的热化学方程式数量.接下来$n$行,每行一个炼金术士已知的热化学方程式.最后一行一个炼金术士想要求解的热化学方程式,末尾记为 ...
- ES6 二进制和八进制字面量
ES6 支持二进制和八进制的字面量,通过在数字前面添加 0o 或者 0O 即可将其转换为二进制值: let oValue = 0o10; console.log(oValue); // 8 let b ...