题目讲解-2023.9
2023-09-22 15:47:46
发布于:浙江
A5550.不规则跳跃
题目思路
根据题目意思,我们可以根据x是否是k的倍数从而分成两类情况。
- 如果x不是k的倍数,那么代表小码君可以一步到达终点,这种情况最少需要走1步
- 如果x是k的倍数,那么小码君可以跳到终点的前一个格子,同时这一个格子绝对不是k的倍数,然后再往前跳一格,就可以到达终点。这种情况最多要走2步
参考代码
#include <iostream>
using namespace std;
int main(){
int t;
cin >> t;
while (t--){
int x,k;
cin >> x >> k;
if (x%k){
cout<<1<<endl;
}else{
cout<<2<<endl;
}
}
return 0;
}
A5551.电梯
题目思路
通过题目可以得知,两部电梯的行走步数。
第一台电梯需要走a层,而第二台电梯需要走|b - a|层。
那么我们只需要判断下a和|b - a|的数值谁最小,然后进行输出即可。
参考代码
#include <iostream>
using namespace std;
int main(){
int t;
cin >> t;
while (t--){
int a,b,c;
cin >> a >> b >> c;
int t1=a,t2=abs(b-c)+c;
if (t1==t2){
cout<<"3\n";
}else{
cout<<int(t1>t2)+1<<endl;
}
}
return 0;
}
A5552.二路归并
题目思路
题目意思要求我们将两个数组合并为一个数组在进行排序,我们可以直接将两个数组的内容输入到一个数组当中,使用sort排序即可。
参考代码
#include<bits/stdc++.h>
using namespace std;
int a[2005];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n+m;i++){
cin>>a[i];
}
sort(a,a+n+m);
for(int i=0;i<n+m;i++){
cout<<a[i]<<" ";
}
return 0;
}
A5553.静态规划
题目思路
小码君可以喝一瓶饮料回复精力,9982443531145141919810是大于所有作业的精力总和,所以有多少作业输出多少作业即可。
参考代码
#include <iostream>
using namespace std;
int main(){
int n,x;
cin >> n >> x;
for(int i = 0 ; i < n ; i ++ )
{
int x;
cin >> x;
}
cout << n << endl;
return 0;
}
A5554.内存计算
题目思路
简单的内存转换问题,我们只需要将输入的n乘与1024两次,然后除于4即可得到答案。
参考代码
#include<iostream>
using namespace std;
int main()
{
long long n;
cin>>n;
cout<<n*1024*1024/4;
return 0;
}
A5555.三数和
题目思路
我们可以枚举a,b,c。计算是否等于n。同时枚举的范围更新为从左往右线性枚举即可。
参考代码
#include <iostream>
using namespace std;
int main(){
int ans=0;
int n;
cin >> n;
for (int a=1;a<=n;++a){
for (int b=a+1;b<=n;++b){
for (int c=b+1;c<=n;++c){
if (a+b+c==n){
++ans;
}
}
}
}
cout<<ans<<endl;
return 0;
}
A5556.身份证验证
题目思路
我们需要将输入的身份证进行转换,根据身份证的权值对照表来统计他的权值总和。
统计出权值总和后对11进行取余,对Z进行判断决定输出Yes还是No。
参考代码
#include <iostream>
#include <string>
using namespace std;
string validateIDCard(const string& idCard) {
if (idCard.length() != 18) {
return "No";
}
int weights[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
char checkCodes[] = "10X98765432";
int total = 0;
for (int i = 0; i < 17; i++) {
int digit = idCard[i] - '0';
int weight = weights[i];
total += digit * weight;
}
int checkCodeIndex = total % 11;
if (idCard[17] == checkCodes[checkCodeIndex]) {
return "Yes";
} else {
return "No";
}
}
int main() {
string idCard;
cin >> idCard;
string result = validateIDCard(idCard);
cout << result << endl;
return 0;
}
A5557.下棋
题目思路
我们可以设定一个结构体,储存每个玩家的英雄转换成的战力总额和记录他的编号。
然后,使用sort加比较函数,根据我们的战力比较规则进行排序,先比较战力,后比较编号,最后进行顺序输出即可。
参考代码
#include <iostream>
#include <algorithm>
using namespace std;
struct Player {
int index;
int strength;
};
bool compare(Player a, Player b) {
if (a.strength == b.strength) {
return a.index < b.index;
}
return a.strength > b.strength;
}
int main() {
int n;
cin >> n;
Player players[n];
for (int i = 0; i < n; i++) {
int a, b, c;
cin >> a >> b >> c;
int strength = a + 3 * b + 9 * c;
players[i].index = i + 1;
players[i].strength = strength;
}
sort(players, players + n, compare);
for (int i = 0; i < n; i++) {
cout << players[i].index << " ";
}
cout << endl;
return 0;
}
A5558.子问题
题目思路
题目要求为从两个数组当中,求出有多少对数字之和加起来等于k。
我们可以使用桶排序的思想,记录第一组的每一个数字和哪一个数字相加刚好等于k,然后在输入第二组数的时候判断桶的这个地方被标记多少次。
参考代码
#include <iostream>
#include <map>
using namespace std;
int main(){
long long n,k;
cin >> n >> k;
map<long long,int> m;
for (int i=0;i<n;++i){
long long t;
cin >> t;
++m[k-t];
}
int ans=0;
for (int i=0;i<n;++i){
long long t;
cin >> t;
ans+=m[t];
}
cout<<ans<<endl;
return 0;
}
A5556.身份证验证
题目思路
一开始我们有一个一维数组A,他的长度为N。随后进行M次操作,每次会给出L,R和color,代表我们要把下标L到下标R之间的元素赋值为color,根据题目意思对数组进行操作,最后输出即可。
参考代码
#include<iostream>
using namespace std;
int main(){
int arr[10001]={0};
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++){
int l,r,color;
cin>>l>>r>>color;
for(int j=l;j<=r;j++){
arr[j]=color;
}
}
for(int i=1;i<=n;i++){
cout<<arr[i]<<endl;
}
return 0;
}
这里空空如也
有帮助,赞一个