问题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 ;
}

最新文章

  1. CLI下另一种多进程实现方式----PCNTL
  2. 【转】 Linux chmod命令
  3. 瀑布流布局--jQuery写法
  4. c++继承详解
  5. SQLite本地事务处理
  6. RadioStream应用源码完整版(iphone版和ipad版)
  7. 客户端session与服务端session
  8. jQ全选效果
  9. 【MFC学习笔记-作业6-sin图像】【OnDraw(CDC* pDC)】
  10. Java基础笔记14
  11. linux下直接拷贝新版本R
  12. 关于会话、进程、请求的几个常用SQL
  13. windows和centos下安装ActiveMQ
  14. context.go
  15. Leetcode 215. 数组中的第K个最大元素 By Python
  16. 设计模式---对象性能模式之享元模式(Flyweight)
  17. Docker 容器内存限制 - 八
  18. Linux下实现秒级定时任务的两种方案
  19. 关于slow http attack以及apche tomcat的应对方式
  20. ionic LoadingController 模块使用

热门文章

  1. python3-继承和多态
  2. nodejs第一天
  3. Excel: assign label to scatter chart using specific cell values
  4. weighted choice in python
  5. React Native 中吐司组件react-native-easy-toast
  6. TCP学习笔记
  7. mac 外接屏幕切换操作
  8. Android环境配置之正式版AndroidStudio1.0
  9. JS判断Android、iOS或浏览器的多种方法(四种方法)
  10. ThreadLocal在Spring事务管理中的应用