题解
难度分布
D
题目大意
给你一个数,输出它在ASCII表的字符。
题目思路
直接输出即可
题目代码
#include<stdio.h>
int main(){
int n;
scanf("%d", &n);
printf("%c\n", n);
return 0;
}
E
题目大意
题目思路
题目怎么说,你怎么做就行
题目代码
#include<stdio.h>
int main(){
int N, S, K;
scanf("%d%d%d", &N, &S, &K);
int sum = 0;
for(int i = 0;i < N;i ++){
int p, q;
scanf("%d%d", &p, &q);
sum += (p * q);
}
if(sum >= S){
printf("%d\n", sum);
}else{
printf("%d\n", sum + K);
}
return 0;
}
B
题目大意
车辆开始的人是不确定的,给你n个数,正数是上车, 负数是下车,问你最后有多少人?
题目思路
本题最关键的是中间车辆不可能有负数个人,为了不让有负数个人,提高初始的人,初始的人就是每次导致中间车辆负数个人的绝对值的和。
同时记得一定要开long long
题目代码
#include<stdio.h>
#define N 200005
typedef long long ll;
//注意本题a[i]最大为1e9,同时n为2e5,所以2e14是会爆int的要开long long
ll a[N];
int main(){
int n;
scanf("%d", &n);
for(int i = 0;i < n;i ++){
scanf("%lld", &a[i]);
}
ll sum = 0;//记得开long long
for(int i = 0;i < n;i ++){
sum += a[i];
if(sum < 0) sum = 0;//车上的人肯定不可能为负数
}
printf("%lld\n", sum);
return 0;
}
C
题目大意
给你三个顶点的坐标,然后问你这三个顶点可不可以组成一个直角三角形
题目思路
思路一 : 直接用勾股定理,记住不要先sqrt再平方,会造成精度问题
思路二(推荐): 用向量,向量相乘等于0就代表垂直,为什么推荐思路二,是因为比如你算面积之类的时候向量就会很方便也不会造成精度问题。
题目代码
思路一:
#include<stdio.h>
int main(){
int xa, ya, xb, yb, xc, yc;
scanf("%d%d%d%d%d%d", &xa, &ya, &xb, &yb, &xc, &yc);
int x = (xa - xb) * (xa - xb) + (ya - yb) * (ya - yb);
int y = (xa - xc) * (xa - xc) + (ya - yc) * (ya - yc);
int z = (xb - xc) * (xb - xc) + (yb - yc) * (yb - yc);
if((x + y == z) || (x + z == y) || (z + y == x)){
printf("Yes\n");
}else{
printf("No\n");
}
return 0;
}
思路二:
#include<stdio.h>
int main(){
int xa, ya, xb, yb, xc, yc;
scanf("%d%d%d%d%d%d", &xa, &ya, &xb, &yb, &xc, &yc);
int x1 = xa - xb, y1 = ya - yb;
int x2 = xa - xc, y2 = ya - yc;
int x3 = xb - xc, y3 = yb - yc;
if((x1 * x2 + y1 * y2 == 0) || (x1 * x3 + y1 * y3 == 0) || (x2 * x3 + y2 * y3 == 0)){
printf("Yes\n");
}else{
printf("No\n");
}
return 0;
}
G
题目大意
题目思路
跟着题目走就行
题目代码
#include<stdio.h>
int main(){
int k, g, m;
scanf("%d%d%d", &k, &g, &m);
int a = 0, b = 0;
while(k --){
if(b == 0 && a != g){//注意a为g先倒掉
b = m;
continue;
}
if(a == g){
a = 0;
continue;
}
if(b){
a += b;
b = 0;
if(a > g){
b = (a - g);
a = g;
}
}
}
printf("%d %d\n", a, b);
return 0;
}
A
题目大意
题目思路
这题我们可以用五进制的思路,然后在最后的时候乘以2, 但是因为五进制是从0开始所以最后要减去2。
NOTE: 如果 428000000 要变成 426888888,同时要用long long
题目代码
#include<stdio.h>
#define N 100
typedef long long ll;
ll a[N];
int main(){
ll n;
scanf("%lld", &n);
int k = 0;
ll res = 0;
while(n){
a[k ++] = (n % 5);
n /= 5;
}
int cnt = 0;
while(a[cnt] == 0) a[cnt ++] = 4;//特判末尾所有的0
a[cnt] -= 1;
ll ans = 0;
for(int i = k - 1;i >= 0;i --){//倒着循环得到答案
ans = ans * 10 + a[i] * 2;
}
printf("%lld\n", ans);
return 0;
}
F
题目大意
题目思路
看代码注解
题目代码
#include<stdio.h>
#include<math.h>
#define MAXN 10
char s[MAXN][MAXN];
int main(){
int N;
scanf("%d", &N);
int n = (int)pow(3, N);
for(int i = 1;i <= n;i ++){
for(int j = 1;j <= n;j ++){
s[i][j] = '#';
}
}
for(int k = N;k >= 1;k --){
//枚举k的大小,先弄大的后弄小的
int g = (int)pow(3, k - 1);
for(int i = g + 1;i <= n;i += g * 3){
//i和j循环, i和j是要放'.'的左上角位置
for(int j = g + 1;j <= n;j += g * 3){
for(int u = i;u < i + g && u <= n;u ++){
//u和v是从左上角位置开始循环放'.'
for(int v = j;v < j + g && v <= n;v ++){
s[u][v] = '.';
}
}
}
}
}
for(int i = 1;i <= n;i ++){
for(int j = 1;j <= n;j ++){
printf("%c", s[i][j]);
}
printf("\n");
}
return 0;
}