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秒 ...
随机推荐
- jenkins插件send files or execute commands over ssh插件parameterized publishing选项使用
1.设置一个参数 2.设置label 3.勾选parameterized publishing
- 详解InitializingBean、initMethod和@PostConstruct
转载:https://blog.csdn.net/nrsc272420199/article/details/95033223 1. InitializingBean.initMethod和@Post ...
- java 中的编码
1.1字节=8位,1024字节=1KB2.16进制0x12345678,其二进制为00010010 00110100 01010110 01111000共4字节3.字节序:两个或多个字节存放的先后顺序 ...
- unkown类型
1,任何类型的值都可以赋给 unkown类型 2. 如果没有类型断言或基于控制流的类型细化时 unknown 不可以赋值给其它类型,此时它只能赋值给 unknown 和 any 类型 3. 如果没有类 ...
- 微信小程序 背景音频播放遇到的深坑
1.微信前台(聊天页)暂停后回到小程序,再点击播放,播放信息消失,无法续播 ios可以监听到 (onStop已经停止)事件, 安卓无法监听到,只能监听到普通的暂停事件. 2.
- Java语言Lang包下常用的工具类介绍_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 无论你在开发哪中 Java 应用程序,都免不了要写很多工具类/工具函数.你可知道,有很多现成的工具类可用,并且代码质量都 ...
- linux运维、架构之路-redis集群
一.介绍 redis cluster 3.0之后的功能,至少需要3(Master)+3(Slave)才能建立集群,是无中心的分布式存储架构,可以在多个节点之间进行数据共享,解决了 ...
- react native之使用 Fetch进行网络数据请求
这是一个单独的页面,可以从其他地方跳转过来. 输入语言关键字,从github检索相关数据 import React, {Component} from 'react'; import { StyleS ...
- HDU 4511 小明系列故事——女友的考验 ( Trie图 && DP )
题意 : 给出编号从1 ~ n 的 n 个平面直角坐标系上的点,求从给出的第一个点出发到达最后一个点的最短路径,其中有两种限制,其一就是只能从编号小的点到达编号大的点,再者不能走接下来给出的 m 个 ...
- 一、Nginx常见问题
1.相同server_name多个虚拟主机优先级访问 最先读取哪个配置文件,就访问那个的网页 2.location匹配优先级 相同location,会被后面的覆盖 匹配优先级更高的,找后面的 = ...