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(动态规划)的题目,大家可以学习相关动态规划芝士

浙公网安备 33010602011771号