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秒 ...
随机推荐
- CF261E Maxim and Calculator (质数,完全背包)
CF261E Maxim and Calculator 题目大意: 有两个初始参数 $ a=1 $ , $ b=0 $ ,你可以对它们进行两个操作: $ b~+=1 $ 或 $ a~\times =b ...
- vue组件结构
1.组件结构 2.项目结构
- delphi 10.3 控件遮挡 webbrowser
听闻10.3的新特性之一,webbrowser可以被其他控件遮挡, 在等待10.3.1出来后才开始来尝鲜, 但在webbrowser上添加控件后, 发现控件还是被挡住了, 研究发现需要将控件的cont ...
- React Native 之组件的定义
App.js 也可以认为是一个组件,那么此文件中能定义多个组件吗? 方式一 import Hello from './Hello' export default class App extends C ...
- qs的两个用途
qs是npm安装的库 1.qs.stringify() 将对象序列化成URL的形式,以&进行拼接 const Qs = require('qs'); let obj= { method: ...
- Vux的安装使用
1.Vux的安装 1.1.vue-cli的vux模板生成项目 可以直接使用 vue-cli 的模板生成一个 vux 项目 vue init airyland/vux2 projectName 由此可以 ...
- k8s登录harbor报错:Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request cance
[root@k8s-node02 ~]# docker login 192.168.180.105:1180 Username: admin Password: Error response from ...
- kohana orm巧用字段备注支持扩展
1.SELECT * FROM `bota_language` WHERE `type` = 'order_type'; id key value type ---- ...
- 【BZOJ4337】树的同构(树同构,哈希)
题意: 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1和T2,如果能够把树T1T ...
- Android环境配置之正式版AndroidStudio1.0
昨天看见 Android Studio 1.0 正式版本发布了:心里挺高兴的. 算是忠实用户了吧,从去年开发者大会一开始出现 AS 后就开始使用了:也是从那时开始就基本没有用过 Eclipse 了:一 ...