JYU新生摸底赛题解

7-1我们欢迎你 !!!

简要题意:输出即可

#include <stdio.h>

int main(){
    printf("我们欢迎你!!!");
    return 0;
}
#include <bits/stdc++.h>

using namespace std;

int main(){
    cout << "我们欢迎你!!!" << endl;
    return 0;
}
print("我们欢迎你!!!")

7-2猫猫的图案

简要题意:读入整数,输出即可,注意输出\的方法

#include <stdio.h>

int main(){
    int a;
    scanf("%d",&a);
    printf(" /\\_/\\\n( o.o )\n > ^ <\n  [%d]",a);
    return 0;
}
#include <bits/stdc++.h>

using namespace std;

int main(){
    int a;
    cin >> a;
    cout << " /\\_/\\\n( o.o )\n > ^ <\n  [ " << a << "]" << endl;
    return 0;
}
a = input();
print(" /\\_/\\")
print("( o.o )")
print(" > ^ <")
print("  [" + a + "]")

学长说:在 C 语言中,\是转义字符的起始,所以要输出\,需要写成 \\

7-3小羽的比较

简要题意:读入abc按照题意判断输出即可

#include <stdio.h>

int main(){
    int a,b,c;
    scanf("%d %d %d",&a,&b,&c);
    if(b <= c)printf("fang xin le");
    else if(c < b && a < b){
        printf("yao huan fa xing le");
    }else if(c < b && b <= a){
        printf("suan le suan le");
    }
    return 0;
}
#include <bits/stdc++.h>

using namespace std;

int main(){
    int a,b,c;
    cin >> a >> b >> c;
    if(b <= c)cout << "fang xin le" << endl;
    else if(c < b && a < b){
        cout << "yao huan fa xing le" << endl;
    }else if(c < b && b <= a){
        cout << "suan le suan le" << endl;
    }
    return 0;
}
a, b, c = map(int, input().split())

if b <= c:
    print("fang xin le")
elif c < b and a < b:
    print("yao huan fa xing le")
elif c < b and b <= a:
    print("suan le suan le")

学长说:按照题意这是一个连续的对比,if后记得要else

7-4猫猫的拼好词

简要题意:读入三个字符串,输出第一个字符串的第一个字符,输出第二个字符串的第二个字符,输出第三个字符串的第三个字符(当然也可以拼接后输出)

#include <stdio.h>

char a[5][5];

int main(){
    scanf("%s",a[1]);
    scanf("%s",a[2]);
    scanf("%s",a[3]);
    printf("%c%c%c",a[1][0],a[2][1],a[3][2]);
    return 0;
}
#include <bits/stdc++.h>

using namespace std;

int main(){
    string a,b,c;
    cin >> a >> b >> c;
    cout << a[0] << b[1] << c[2] << endl;
    return 0;
}
a = input().strip()
b = input().strip()
c = input().strip()
str = a[0] + b[1] + c[2]
print(str)

学长说:需要学会字符串和字符数组

7-5猫猫购物

简要题意:用最少的价格,买至少k瓶可口可乐,(可以超过k瓶),一店一瓶a元,二店两瓶b元,输出最少花费

#include <stdio.h>

int main(){
    int a,b,k;
    scanf("%d %d %d",&a,&b,&k);
    int ans = 0;
    if(b <= a){
        ans = (k + 1) / 2 * b;
    }else if(b > a && b <= 2 * a){
        ans += k / 2 * b;
        ans += k % 2 * a;
    }else if(2 * a < b){
        ans += k * a;
    }
    printf("%d",ans);
    return 0;
}
#include <bits/stdc++.h>

using namespace std;

int main(){
    int a,b,k;
    cin >> a >> b >> k;
    int ans = 0;
    if(b > a * 2)b = 2 * a;
    ans += k / 2 * b;
    ans += k % 2 * a;
    int ans2 = 0;
    ans2 += (k + 1) / 2 * b;
    ans2 += (k + 1) % 2 * a;
    cout << min(ans,ans2) << endl;
    return 0;
}
a, b, k = map(int, input().split())
ans = 0
if b <= a:
    ans = (k + 1) // 2 * b
elif b > a and b <= 2 * a:
    ans += k // 2 * b
    ans += k % 2 * a
elif 2 * a < b:
    ans += k * a
print(ans)

学长说:至少买k瓶,是可以超过k瓶的例如(买k+1瓶的价钱小于买k瓶的)

7-6校园寻宝其一

简要题意:求曼哈顿距离d(i,j)=|xi-xj|+|yi-yj|

#include <stdio.h>

int main(){
    int a,b,x,y;
    scanf("%d %d %d %d",&a,&b,&x,&y);
    int l1 = abs(a - x);
    int l2 = abs(b - y);
    int ans = l1 + l2;
    printf("%d",ans);
    return 0;
}
#include <bits/stdc++.h>

using namespace std;

int main(){
    int a,b,x,y;
    cin >> a >> b >> x >> y;
    int l1 = abs(a - x);
    int l2 = abs(b - y);
    int ans = l1 + l2;
    cout << ans;
    return 0;
}
a, b, x, y = map(int, input().split())
l1 = abs(a - x)
l2 = abs(b - y)
ans = l1 + l2
print(ans)

学长说:善用自带函数abs()取绝对值

7-7校园寻宝其二

简要题意:欧式距离,勾股定理

#include <stdio.h>

int main(){
    int a,b,x,y;
    scanf("%d %d %d %d",&a,&b,&x,&y);
    double l1 = abs(a - x);
    double l2 = abs(b - y);
    double ans = sqrt(l1 * l1 + l2 * l2);
    printf("%.2lf",ans);
    return 0;
}
#include <bits/stdc++.h>

using namespace std;

int main(){
    int a,b,x,y;
    cin >> a >> b >> x >> y;
    double l1 = abs(a - x);
    double l2 = abs(b - y);
    double ans = sqrt(l1 * l1 + l2 * l2);
    printf("%.2lf",ans);
    return 0;
}
import math
a, b, x, y = map(int, input().split())
l1 = abs(a - x)
l2 = abs(b - y)
ans = math.sqrt(l1 **2 + l2** 2)
print("{0:.2f}".format(ans))

学长说:注意浮点数,和读懂题意

7-8接烂梗高手

简要题意:读入字符串,比按照题目要求输出

#include <stdio.h>

char s[1000];

int main(){
    scanf("%s",s);
    if(s[0] == 'j'){
        printf("taimei");
    }else if(s[0] == 'n'){
        printf("dandonglai");
    }else if(s[0] == 'a'){
        printf("telasi");
    }else if(s[0] == 'h'){
        printf("manbo");
    }else if(s[0] == 'x'){
        printf("weiwowushi");
    }
    return 0;
}
#include <bits/stdc++.h>

using namespace std;

int main(){
    string a;
    cin >> a;
    if(a == "jini") cout << "taimei" << endl;
    else if(a == "nicong") cout << "dandonglai" << endl;
    else if(a == "ama") cout << "telasi" << endl;
    else if(a == "hajimi") cout << "manbo" << endl;
    else if(a == "xinqishi") cout << "weiwowushi" << endl;
    return 0;
}
a = input().strip()
if a == "jini":
    print("taimei")
elif a == "nicong":
    print("dandonglai")
elif a == "ama":
    print("telasi")
elif a == "hajimi":
    print("manbo")
elif a == "xinqishi":
    print("weiwowushi")

学长说:学会使用字符串和字符数组

7-9leap-easy

简要题意:按照数组,奇数走两格,偶数三格,看能走多少(吃多少)

#include <stdio.h>

int a[10010];

int main(){
    int n;
    scanf("%d",&n);
    for(int i = 1; i <= n; i ++){
        scanf("%d",&a[i]);
    }
    int ans = 0;
    for(int i = 1; i <= n;){
        ans ++;
        if(a[i] % 2 == 1)i += 2;
        else i += 3;
    }
    printf("%d",ans);
    return 0;
}
#include <bits/stdc++.h>

using namespace std;

int main(){
    int n;
    cin >> n;
    vector<int> a(n);
    for(int i = 0; i < n; i ++)cin >> a[i];
    int ans = 0;
    for(int i = 0; i < n;){
        ans ++;
        if(a[i] % 2 == 1)i += 2;
        else i += 3;
    }
    cout << ans << endl;
    return 0;
}
n = int(input())
a = list(map(int, input().split()))
ans = 0
i = 0
while i < n:
    ans += 1
    if a[i] % 2 == 1:
        i += 2
    else:
        i += 3
print(ans)

学长说:学会使用for循环,按照题意模拟

7-10爱的寻找

简要题意:加上含有'9'的数字,输出

#include <stdio.h>

int main(){
    int n;
    scanf("%d",&n);
    int ans = 0;
    for(int i = 1,a,k; i <= n; i ++){
        scanf("%d",&a);
        k = a;
        int pd = 0;
        while(k){
            if(k % 10 == 9) pd = 1;
            k /= 10;
        }
        if(pd == 1) ans += a;
    }
    printf("%d",ans);
    return 0;
}
#include <bits/stdc++.h>

using namespace std;

int main() {
    int n;
    cin >> n;
    int ans = 0;
    for (int i = 1; i <= n; ++i) {
        int a;
        cin >> a;
        int k = a;
        bool pd = false;
        while (k) {
            if (k % 10 == 9) {
                pd = true;
            }
            k /= 10;
        }
        if (pd) {
            ans += a;
        }
    }
    cout << ans;
    return 0;
}
def check(x):
    while x:
        if x % 10 == 9:
            return True
        x = x // 10
    return False

import sys
data = list(map(int, sys.stdin.read().split()))
n = data[0]
numbers = data[1:1+n]
ans = 0
for num in numbers:
    if check(num):
        ans += num
print(ans)

学长说:需要学会如何判断是否带'9',上述代码使用的是把每一位数拆解出来判断

7-11猫猫数数

#include <stdio.h>

//const int N = 1e5 +10;

int a[100010];
int qzh[15][100010];

int main(){
    int n;
    scanf("%d",&n);
    for(int i = 1; i <= n; i ++){
        scanf("%d",&a[i]);
        while(a[i] >= 10){
            int kk = 0;
            while(a[i]){
                kk += a[i] % 10;
                a[i] /= 10;
            }
            a[i] = kk;
        }
    }
//for(int i = 1; i <= n; i ++)printf("%d ",a[i]);
    for(int i = 1; i <= n; i ++){
        qzh[a[i]][i] ++;
    }
    for(int i = 0; i <= 9; i ++){
        for(int j = 1; j <= n; j ++){
            qzh[i][j] +=qzh[i][j-1];
        }
    }
    for(int i = 1; i <= n; i ++){
        int ans = 0;
        ans = abs(qzh[a[i]][i-1] - (qzh[a[i]][n] - qzh[a[i]][i]));
        if(i == 1)printf("%d",ans);
        else printf(" %d",ans);
    }
    return 0;
}
#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 +10;

int a[N];
int qzh[15][N];

int main(){
    int n;
    cin >> n;
    for(int i = 1; i <= n; i ++){
        cin >> a[i];
        while(a[i] >= 10){
            int kk = 0;
            while(a[i]){
                kk += a[i] % 10;
                a[i] /= 10;
            }
            a[i] = kk;
        }
    }
//for(int i = 1; i <= n; i ++)cout << a[i] << " ";
    for(int i = 1; i <= n; i ++){
        qzh[a[i]][i] ++;
    }
    for(int i = 0; i <= 9; i ++){
        for(int j = 1; j <= n; j ++){
            qzh[i][j] +=qzh[i][j-1];
        }
    }
    for(int i = 1; i <= n; i ++){
        int ans = 0;
        ans = abs(qzh[a[i]][i-1] - (qzh[a[i]][n] - qzh[a[i]][i]));
        if(i == 1)cout << ans;
        else cout << " " << ans;
    }
    return 0;
}
n = int(input())
a = list(map(int, input().split()))
s = [0] * 10
for num in a:
    root = ((num - 1)%9) +1
    s[root] += 1
c = [0]*10
result=[]
for num in a:
    root = ((num-1)%9)+1
    right_count = s[root]-c[root]-1
    left_count = c[root]
    result.append(str(abs(right_count-left_count)))
    c[root] += 1
print(' '.join(result))

学长说:比赛题目中经常会出现我们没听说过的概念,需要自己阅读理解,比如本题的数字根,本题还需要学习前缀和算法

7-12%%大佬

简要题意:读入名字和和能力值按照能力值大在前,字典序小在前的方法排序并输出

c语言:

#include <stdio.h>
#include <string.h>

struct a {
    char b[11];
    int c;
};

int main() {
    int d;
    scanf("%d", &d);

    struct a e[1000];
    for (int f = 0; f < d; f++) {
        scanf("%s %d", e[f].b, &e[f].c);
    }
    //冒泡排序
    for (int f = 0; f < d - 1; f++) {
        for (int g = 0; g < d - f - 1; g++) {
            if (e[g].c < e[g + 1].c) {
                struct a h = e[g];
                e[g] = e[g + 1];
                e[g + 1] = h;
            }
            //字典序
            else if (e[g].c == e[g + 1].c) {
                int i = strlen(e[g].b);
                int j = strlen(e[g + 1].b);
                int k = i < j ? i : j;
                int l = 1;
                for (int m = 0; m < k; m++) {
                    if (e[g].b[m] != e[g + 1].b[m]) {
                        l = 0;
                        if (e[g].b[m] > e[g + 1].b[m]) {
                            struct a h = e[g];
                            e[g] = e[g + 1];
                            e[g + 1] = h;
                        }
                        break;
                    }
                }
                if (l && i > j) {
                    struct a h = e[g];
                    e[g] = e[g + 1];
                    e[g + 1] = h;
                }
            }
        }
    }

    for (int f = 0; f < d; f++) {
        printf("%d %s %d\n", f + 1, e[f].b, e[f].c);
    }

    return 0;
}
#include <bits/stdc++.h>

using namespace std;

bool cmp(pair<int,string> x,pair<int,string> y){
    if(x.first == y.first)return x.second < y.second;
    return x.first > y.first;
}

int main(){
    int n;
    cin >> n;
    vector<pair<int,string>> a(n);
    for(int i = 0; i < n; i ++){
        cin >> a[i].second >> a[i].first;
    }
    sort(a.begin(),a.end(),cmp);
    for(int i = 0; i < n; i ++){
        cout << i + 1 << " " << a[i].second << " " << a[i].first << endl;
    }
    return 0;
}
n=int(input())
members=[]
for i in range(n):
    name,x=input().split()
    x = int(x)
    members.append((-x, name, x))
members.sort()
for idx, (_, name,x) in enumerate(members,1):
    print(f"{idx} {name} {x}")

学长说:本题考点是结构体和排序问题,结构体需要大家都熟练使用,排序大家可以从冒泡,快排,归并等算法开始学习

7-13爱的寻找(hard)

简要题意:给定区间[l,r],计算该区间内数字包含 “9” 的整数的个数。

#include <stdio.h>
#include <string.h>

int l, r;
int a[35], idx, dp[35][2];

int dfs(int u, int state, int lead, int limit)
{
    if (u == 0) return state;
    if (!lead && !limit && dp[u][state] != -1) return dp[u][state];
    int res = 0, up = limit ? a[u] : 9;
    for (int i = 0; i <= up; i++) {
        res += dfs(u - 1, state | (i == 9), lead && (i == 0), limit && (i == up));
    }
    if (!lead && !limit) dp[u][state] = res;
    return res;
}

int cal(int x)
{
    idx = 0;
    while (x) {
        a[++idx] = x % 10;
        x /= 10;
    }
    memset(dp, -1, sizeof(dp));
    return dfs(idx, 0, 1, 1);
}

int main()
{
    scanf("%d %d", &l, &r);
    printf("%d\n", cal(r) - cal(l - 1));
    return 0;
}
#include <bits/stdc++.h>

using namespace std;

const int N = 35;

int l, r;
int a[N], idx, dp[N][2];

int dfs(int u, int state, bool lead, bool limit)
{
    if (u == 0) return state;
    if (!lead && !limit && ~dp[u][state]) return dp[u][state];
    int res = 0, up = limit ? a[u] : 9;
    for (int i = 0; i <= up; i ++) {
        res += dfs(u - 1, state | (i == 9), lead & (i == 0), limit & (i == up));
    }
    if (!lead && !limit) dp[u][state] = res;
    return res;
}

int cal(int x)
{
    idx = 0;
    while (x) a[++ idx] = x % 10, x /= 10;
    memset(dp, -1,sizeof dp);
    return dfs(idx, 0, 1, 1);
}

int main()
{
    cin >> l >> r;
    cout << cal(r) - cal(l - 1);
    return 0;
}
def count9(n):
    if n < 0:
        return 0
    s = list(map(int, str(n)))
    length = len(s)
    cache = {}
    def dfs(pos, has_9, limit, lead):
        if pos == length:
            return 1 if has_9 else 0
        key = (pos, has_9, limit, lead)
        if key in cache:
            return cache[key]
        res = 0
        up = s[pos] if limit else 9
        for i in range(0, up + 1):
            new_limit = limit and (i == up)
            new_lead = lead and (i == 0)
            new_has_9 = has_9 or (i == 9)
            res += dfs(pos + 1, new_has_9, new_limit, new_lead)
        cache[key] = res
        return res
    return dfs(0, False, True, True)
l, r = map(int, input().split())
print(count9(r)-count9(l-1))

学长说:本题是很典型的数位dp(动态规划)的题目,大家可以学习相关动态规划芝士

posted @ 2025-09-19 00:11  ha000star  阅读(296)  评论(0)    收藏  举报