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; 
}