该答案为个人总结,部分答案为对李学长答案的简化,并非完全个人原创
为了让各个层次的同学可以理解答案,
本答案优先使用C语言,部分答案确实需要C++的请见谅
如有错误请及时指出,谢谢
目录
A:HF 的智能小车车
题目描述
众嗦粥汁,HF 最近天天泡在实验室里做他的智能小车车,但在调试的时候发现控制转向和行进的指令搞混了。这种小事对他来说太简单了,用他的原话说就是:"有手就行",于是他就懒得继续做下去了。
HF 把这个做了一半的车子丢给了 LYS ,如果他能解决掉这些问题,这个智能小车车就归 LYS 辣。
以下是需要解决的问题:
当输入右转向指令为 R 时,执行左转指令 L,反之亦然。
当输入前进指令为 U 时,执行向后退指令 D,反之亦然。
LYS 肥肠想要这个小车车,可是他啥也不会,现在他来找你帮忙了,你能帮帮他吗?
输入
一行,一个字符 P ,表示输入的指令。
输出
一行,一个字符,表示执行的指令。
样例输入
R
样例输出
L
提示
数据范围:
题目解析:
无
代码:
#include<stdio.h>
int main() {
char ch;
scanf("%c",&ch);
if(ch=='R')
puts("L");
else if(ch=='L')
puts("R");
else if(ch=='U')
puts("D");
else if(ch=='D')
puts("U");
return 0;
}
B:Do you like Van game?
题目描述
野兽仙贝想跟你 Van 一个游戏,要是你赢了就能让你嘿嘿嘿,反之亦然。
野兽仙贝拿出了三个超大号皮搋子放在桌上,分别编号为 1,2,3 ,初始对应位置编号也为 1,2,3 。其中某个的皮搋子下面藏着一个扩音器。
游戏规则:
游戏一共进行 k 轮。
第 ki 轮,仙贝会交换某编号为 ni, mi 的皮搋子的位置,若皮搋子下有扩音器,扩音器也会跟着移动。
一轮交换结束,你可以猜一个位置 Pi 。
若猜中了扩音器的位置,则本轮得一分,否则不得分。
野兽仙贝其实很想让你赢,所以游戏开始前,他就尽可能的把扩音器放到了你可以得最高分数的位置,现在请你计算出你最高的得分。
输入
第一行,一个整数 k ,代表游戏进行几轮。
接下来 k 行,每行输入两个整数 ni, mi 和一个整数 Pi ,分别代表皮搋子的编号和你所猜的扩音器的位置编号。
输出
一行,一个整数,表示你可能得到的最高分数。
样例输入
3 1 2 1 3 2 1 1 3 1
样例输出
2
题目解析:
一、通过一个循环将扩音器分别放在三个皮搋子(变量wi)中:
通过定义拥有三个数据的数组,用 0 表示没有扩音器,用 1 表示有扩音器
二、交换皮搋子的位置:
c语言用中间值temp进行交换,c++可以直接用swap函数进行交换
三、验证猜测是否正确:
通过验证对应皮搋子所代表的数组数据是否为 1 来判断是否猜测正确
四、积分
如果猜测成立则将score(分数)加 1 ,然后在循环结束后对max(最大值)进行更新
代码 :
#include<stdio.h>
int main() {
int k,max=-1;
scanf("%d",&k);
int m[k],n[k],p[k];
for(int i=0; i<k; i++)
scanf("%d %d %d",&m[i],&n[i],&p[i]);//记录交换的皮搋子与猜测的皮搋子编号
for(int wi=1; wi<=3; wi++) {//分别将扩音器放于三个不同位置
int posi[4]= {0};
int score=0;
posi[wi]=1;
for(int i=0; i<k; i++) {
int temp=posi[m[i]];
posi[m[i]]=posi[n[i]];
posi[n[i]]=temp;
//swap(posi[m[i]],posi[n[i]]);利用swap(c++)函数可以直接完成交换动作
if(posi[p[i]]==1)
score++;//若猜中则加一分
}
if(max<score)
max=score;//记录最高得分
}
printf("%d",max);
return 0;
}
C:好姐姐的三角形
题目描述
三角形给人一种稳固的感觉,我们的好姐姐 WJX 最喜欢三角形了,现在她想用一些字母拼出来等腰三角形,你能帮帮她吗?
输入
第一行,一个整数 t,表示样例数量。
接下来 t 行,第 ti 行输入一个整数 ni 和一个字符 ci,分别表示三角形的高度和用来拼成三角形的字符。
输出
共 t 行,每行用所给字符输出对应高度的等腰三角形。
每个样例之间空一行。
样例输入
2 2 A 3 B
样例输出
A AAA B B B BBBBB
提示
题目解析:
见代码
代码:
#include<stdio.h>
int main() {
int t;
scanf("%d",&t);
while(t--) {
char ch;
int num;
scanf("%d %c",&num,&ch);//输入层数与字符
for(int i = 1; i<=num; i++) {//逐层打印
for(int j=0; j<num-i; j++)
printf(" ");//打印每一行三角形左方的空格
for(int j=0; j<2*i-1; j++) {
if(j == 0 || j == 2*i-2 || i == num) {//j==0为三角形左斜边
printf("%c",ch); //j==2*i-2为三角形右斜边
} else { //i==num为三角形的底边
printf(" ");
}
}
printf("\n");//每打印完一行进行换行
}
printf("\n");//题目要求各个图形间空一行
}
return 0;
}
D:帮帮小陈
题目描述
我们的好姐姐 WJX 在拼三角形的时候突发奇想,想要考考小陈同学,假如有 n 个整数 i,以这 n 个整数中的三个整数为边长能够构成多少个三角形?
结果小陈同学一时大意,不小心被难住了,你能帮帮他吗?
输入
第一行一个整数 t,表示 t 个测试样例。
每个样例第一行一个整数 n ,表示有 n 个可选的边。
每个样例第二行 n 个整数 i ,表示三角形的边长。
输出
共 t 行,每行一个整数,表示该测试样例下能构成的三角形的数量。
样例输入
1 4 2 2 3 4
样例输出
3
提示
题目解析:
见代码
代码:
#include <bits/stdc++.h>
using namespace std;
int a[10000000];
int main() {
int t;
cin >>t;
while(t--) {
int n;
cin >> n;
for(int i = 0; i < n; i ++) cin >> a[i];
sort(a, a + n); //排序
long long sum = 0;
for(int i = 0; i + 2 < n; i ++) { //枚举第一个边
while(a[i] == 0 && i < n) i ++; //从不是 0 的位置开始
for(int j = i + 1; j + 1 < n; j ++) { //枚举第二个边
int l = j + 1, r = n - 1;
int p = a[i] + a[j];
while(l < r) { //二分,找到最大的 a[k] < a[i] + a[j]
int mid = l + r + 1 >> 1;
if(a[mid] < p) l = mid;
else r = mid - 1;
}
if(a[l] < p) sum += l - j; //特判一下是否满足
else sum += l - j - 1;
}
}
cout << sum << endl;
}
return 0;
}
E:卷点
题目描述
小陈同学很感谢你的帮助,作为回报,他也给你出了一个有趣的问题。
现在给出一个“卷点”的定义:在一个正方形内存在某一点,使得这个点和正方形四个顶点连接而划分出的四块三角形的面积比为 a : b : c : d。四个数不分顺序;卷点不是唯一的。
现在有一个正方形,给出 a, b, c, d 这 4 个整数 ,表示被某点划分出的四个三角形的面积,判断有多少个这样的卷点在正方形内部?
输入
第一行一个整数 n ,代表 n 个测试样例。
接下来 n 行,每行 4 个整数 a, b, c, d ,表示四个三角形的面积。
输出
共 n 行,每行一个整数,表示卷点的数量。
样例输入
3 1 3 3 1 2 4 7 8 2 3 1 4
样例输出
4 0 8
提示
题目解析:
图一:存在四个面积都相等三角形,只有一种“卷点”
图二:存在两个面积相等的三角形,一共有四种“卷点“
图三:不存在面积相等的三角形,一共有八种“卷点”
PS:图二可以将图片旋转得到总共四个“卷点”;图三可以通过旋转与翻转得到八个“卷点”
“卷点”数为零的情况说明:四个三角形底边相同,面积之比就是高之比,故当存在两个三角形面积之和等于另外两个三角形面积之和时才存在“卷点”,若不存在则没有“卷点”
代码:
#include<stdio.h>
int main() {
int n;
scanf("%d",&n);
while(n--) {
double a,b,c,d;//题目中的数据范围为10的18次方,故用double
int x,y,ans;
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
if(a+b==c+d||a+c==b+d||a+d==b+c) {
//只有存在两个三角形面积和等于另外两个三角形面积和时存在“卷点”
if(a==b&&b==c&&c==d)
//当四个三角形面积相等时就只有中心1个卷点
printf("1\n");
else if(a==b&&c==d||(a==c&&b==d)||(a==d&&b==c)) {
//当四个三角形面积不完全相等但有两两相等,则有4个“卷点”
printf("4\n");
} else {
//当四个三角想面积都不相等,则有8个“卷点”
printf("8\n");
}
} else
printf("0\n");
}
return 0;
}
F:签个到就下班
题目描述
给定一个字符串 S ,和两个一位整数 N,M,按照出现的顺序输出其中所有的在 N~M 之间的数字字符。
输入
第一行,两个整数 N, M。
第二行,一个字符串 S 。
输出
一行,若干个整数,为 S 处理后的结果,每个整数间隔一个空格。
样例输入
1 2 abc123
样例输出
1 2
提示
题目解析:
遍历字符串,通过s [ i ] - ' 0 '来将字符变为对应数字,由此判断是否在范围内(m<x<n)
代码:
#include<stdio.h>
#include<string.h>
int main() {
int m,n;
char s[1000001];
scanf("%d %d",&m,&n);
scanf("%s",s);
int len=strlen(s) ;
for(int i=0; i<=len; i++) {
if(s[i]-'0'>=m&&s[i]-'0'<=n)
printf("%d ",s[i]-'0');
}
return 0;
}
G:现在是摸鱼时间
题目描述
输入
输出
样例输入
6 3 5 1 3 9 5
样例输出
1
提示
题目解析:
见代码
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
long long sum = 0;
map<int,int> vis;
int n;
cin >> n;
for(int i = 0; i < n; i ++) {
int x;
cin >> x;
x -= i;
sum += vis[x]; //加上当前位置之前 x 出现过的次数
vis[x] ++; //更新次数
}
cout << sum << endl;
return 0;
}
H:现在是摸鱼时间 PLUS
题目描述
输入
输出
样例输入
6 3 5 1 3 9 5
样例输出
11
提示
题目解析:
见代码
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <sstream>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
using namespace std;
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define re register
#define fi first
#define se second
#define endl '\n'
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
const int N = 1e6 + 3;
const int INF = 0x3f3f3f3f, mod = 1e9 + 7;
const double eps = 1e-6, PI = acos(-1);
//以上为大量头文件
int gcd(int a, int b) { //求最大公约数
return b ? gcd(b, a % b) : a;
}
int main() {
IOS;
int res = -1;
int n;
cin >> n;
map<int, int> a; //存入出现过的状态
for(re int i = 1; i <= n; i ++) {
int x;
cin >> x;
a[x] = i; //保留最大下标
}
for(auto &p : a)
for(auto &t : a)
if(gcd(p.fi, t.fi) == 1) res = max(res, p.se + t.se); //更新答案
cout << res << endl;
return 0;
}