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秒 ...
随机推荐
- gremlin语言语法--学习笔记
学习gremlin语言的目的:测试图数据,支持gremlin语句,所以必须系统学习一下!!!! 一.基础查询 g.V() 查询所有的顶点 g.V(3) 查询顶点id为3的点.字符串id的要到引号V(& ...
- @RequestBody、@RequestParam、@PathVariable区别与使用场景
由于项目是前后端分离,因此后台使用的是spring boot,做成微服务,只暴露接口.接口设计风格为restful的风格,在get请求下,后台接收参数的注解为RequestBody时会报错:在post ...
- 微信小程序 背景音频播放遇到的深坑
1.微信前台(聊天页)暂停后回到小程序,再点击播放,播放信息消失,无法续播 ios可以监听到 (onStop已经停止)事件, 安卓无法监听到,只能监听到普通的暂停事件. 2.
- 两个jquery编写插件实例
(1) 封装基于jq弹窗插件 相信码友们对于$.fn.extexd();$.extend()以及$.fn.custom和$.custom都有一定的了解:我阐述一下我自己对于$.fn.custom和 ...
- axios中put和patch的区别(都是update , put是需要提交整个对象资源,patch是可以修改局部)
patch方法用来更新局部资源,这句话我们该如何理解? 假设我们有一个UserInfo,里面有userId, userName, userGender等10个字段.可你的编辑功能因为需求,在某个特别的 ...
- Liunx的软链接和硬链接
ln 命令 命令名称: ln. 英文原意: make links between file. 所在路径: /bin/ln. 执行权限:所有用户. 功能描述:在文件之间建立链接. ln 命令 ...
- 学习wavenet_vocoder之预处理、训练
一.预处理 1.在进行预处理时,如果不明白需要的参数,可以使用命令获取帮助,从这里我们可以看到可以具体的用法和对应的参数. python preprocess.py --help python pre ...
- kali语言设置
1.直接在终端命令 dpkg-reconfigure locales 然后按需选择支持字符编码:en_US.UTF-8(英文).zh_CN.GBK(中文).zh_CN.UTF-8(中文) (注:选择字 ...
- 前端进阶系列(二):css常见布局解决方案
水平居中布局 margin+定宽 <div class="parent"> <div class="child">Demo</di ...
- 《SQL Server 2012 T-SQL基础》读书笔记 - 4.子查询
Chapter 4 Subqueries 子查询分为:独立子查询(Self-Contained Subqueries)和相关子查询(Correlated Subqueries),独立子查询可以单独拿出 ...