1.捡石头
【题目描述】 小强在河边捡了 2块漂亮的石头,他想再捡两块石头,让这4块石头的质量正好为 30斤,并且新捡的两块石头的质量是介于前两块石头的质量之间的数字,请编程 输出第3 块和第4块石头的质量。注:每个石头的重量都是整数如果找不到合适 的石头,则输出00。
【输入格式】 输入2个数,数与数之间以空格间隔,表示2块石头的质量。
【输出格式】 输出表示第 3、4 块石头的质量的所有可能结果,每块石头质量的数字用空格隔开。多组结果时,按第3块石头质量从小到大排序分行输出。
【样例输入】(测试数据不包含本样例)
1 11
【样例输出】
8 10
9 9
根据王辰天同学的代码整理的题解
#include<bits/stdc++.h>
using namespace std;
/*
本题采用枚举法:
1、 3,4两块新捡的石头重量,介于1,2两块石头之间
2、已知的1,2两块石头重量是需要我们输入的,
可以使用循环从重量最小的开始,遍历到重量最大的石头为止
(for循环结构)
3、4块石头的总重量是30斤,可以列出条件s1+s2+s3+s4=30c
4、如果有结果,需要按第3块石头重量进行升序排序
*/
int main() {
int a, b, h = 0;
cin >> a >> b;
//类似我们学习过的“百僧百馍”,“鸡兔同笼”问题的解法
//使用min函数从两个数字中找到最小数,max函数从两个数字中找到最大数
for (int i = min(a, b) + 1; i < max(a, b); i++) {
for (int j = min(a, b) + 1; j < max(a, b); j++) {
//根据3,4两项列出的条件语句,满足条件就可以求出结果
if (i + j + a + b == 30 && i <= j) {
cout << i << " " << j << endl;
h++;
}
}
}
//枚举完所有的条件后,没有找到答案,返回00
if (h == 0||min(a, b) ==0) {
cout << "00";
}
return 0;
}
2.判断数字出现了几次
【题目描述】 给定一个正整数n,判断从 1 到这个数本身的所有数中,一共出现了多少次数字 k。
【输入格式】 输入共 1 行,包括一个正整数 n 和一个正整数 k。(0<n<32767,0<k<10)
【输出格式】 输出共 1 行,一个整数,表示 1 到 n 之间的所有数 (包括n),一共出现了几次k。
【样例输入】(测试数据不包含本样例)
13 3
【样例输出】
2
根据焦胤程同学的代码整理的题解:
#include<bits/stdc++.h>
using namespace std;
int n,k,ans,a;
/*
本题的核心是学会拆分给定数字的各个数位上的数并进行判断。
拆分数位是上期课程中的重点知识,
通过除法退位和取余求数来获取每个数位上的数字
*/
int main(){
cin>>n>>k;
//题目要求从1开始到这个数本身,也就是我们输入的n
//使用for循环结构
for(int i=1;i<=n;i++)
{
a=i;//a属于临时变量,用于计算每个i数值中出现多少次k
//while循环,逐一获取a数值各个数位上的数字
//这个结构是我们上期课程中练习比较多的,例题有:3721数,回文数、幂的末尾等
while(a){
//a%10获取个位判断是否等于k
if(a%10==k)
ans++;
//获取高位上的数字
a/=10;
}
}
cout<<ans;
return 0;
}
滑雪板打包问题
【题目描述】 一家新开业的滑雪场,需要采购不同规格的滑雪板,每个滑雪板的长度是不固定的,现在需要把排列好的滑雪板用木板做成木箱封装好进行快递,每次快递的总重 量是有限制的,不能超过重量 G。只要每次打包的重量不超过 G,多个滑雪板可以摞 放在一起,使用与最长滑雪板长度相同的两个木板进行固定。假设,给出排列好的每个滑雪板的重量 Gi ,和长度 Li ,请计算需要最少多长的木板才能将所有的滑雪板把包好。
【输入格式】 输入的第一行有两个数字,一个是滑雪板的个数,一个是包裹总重量。以下滑雪板个数行,每行的第一个数是滑雪板的重量 Gi 和长度 Li。
【输出格式】 输出需要最少的木板的总长度。注:每次打包需要 2 个木板。
【样例输入】(测试数据不包含本样例)
5 5 2 1 1 2 1 3 2 3 2 2
【样例输出】 10
思路解析: 读取输入:读取滑雪板的个数n和包裹总重量G,然后读取每个滑雪板的重量Gi和长度Li。 排序:按照滑雪板的长度Li进行降序排序。 打包:从最长的滑雪板开始,尝试将它们放入包裹中,直到达到或超过总重量G。此时,计算当前包 裹所需的木板长度(即最长滑雪板的长度Li的两倍),并累加到总木板长度中。 继续打包:继续处理剩余的滑雪板,直到所有滑雪板都被打包。 输出结果:输出总木板长度。 【参考代码】
#include <bits/stdc++.h>
using namespace std;
struct Node{
int g,l;
int state=0;//是否被打包,默认是未被打包
//重戴函数
bool operator < (const Node &a) const{
return a.l<l;
}
}a[10005];
int main(){
int n,wg;//数量和总重量
cin>>n>>wg;
for(int i=0;i<n;i++)
cin>>a[i].g>>a[i].l;
//降序排列
sort(a,a+n);
//打包处理
int cnt=0;//统计打包的滑板长度
//将所以的滑板根据条件去打包
for(int i=0;i<n;i++)
{
if(a[i].state==0)
{
int t=wg-a[i].g;
a[i].state=1;
cnt+=a[i].l;
for(int j=i;j<=n;j++)
{
if(t>=a[j].g&&a[j].state==0)
{
t-=a[j].g;
a[j].state=1;
}
}
}
}
cout<<cnt*2;
return 0;
}