华农acm:scau 9510 修房屋

7 篇文章 0 订阅
1 篇文章 0 订阅

题目:

9510 修房屋
时间限制:1000MS  内存限制:65535K
提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC
Description
Dragon123的在马路旁边拥有一间老房子。市政府为了迎接亚运,规定凡是位于主干道旁边的房子必须进行修葺,否则一律派城管和施工队强拆。
因此,Dragon123不得不自己掏钱来修复他这套老房子。
在修房子的过程中,Dragon123需要三种不同类型的砖头,分别为1*20,1*28,1*32的。
建材城里只有1*75的砖头,不过大砖头可以裁成小砖头.dragon123希望知道他至少需要买多少1*75的砖头才够用。



输入格式
输入数据第一行包含三个整数X,Y,Z(0<=X,Y,Z<=100),分别表示dragon123需要的1*20,1*28,1*32的砖头的数量。


输出格式
输出为一个整数,为dragon123需要的1*75的砖头的数量。


输入样例
4 2 2


输出样例
3


来源 PKKJ 

作者 a470086609

题解:

这题其实就是把不同的小砖头组合,A,B,C,这一块大砖头可以切成{2*A,B},{2*A,C},{B,C},以及{3*A},{2*B},{2*C}

接下来按照数量优先的顺序排好,数量相同的条件下排面积。面积大的靠在前面啊。

{2*A,C},{2*A,B},{3A},{2*C}  , {B,C} ,    {2*B}

一共六种使用方式,一次按照顺序进行切割,达到最终状态后停止就可以了。

#ifdef local
#include    <ctime>
#endif
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>
#define rep(i,e) for(int i=0;i<e;i++)
#define rep1(i,e) for(int i=1;i<=e;i++)
#define repx(i,x,e) for(int i=x;i<=e;i++)
#define ll long long
#define pii pair<int,int>
#define F first
#define S second
#define pb push_back
#define mp make_pair
#define mset(var,val) memset(var,val,sizeof(var))
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define test(a) cout<<a<<endl
#define test2(a,b) cout<<a<<" "<<b<<endl
#define test3(a,b,c) cout<<a<<" "<<b<<" "<<c<<endl
typedef unsigned long long ull;
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 1e6 + 10;
int  len[N];
int adder[][3] = { {2, 0, 1},{2, 1, 0},{3, 0, 0},{0, 0, 2},{0, 1, 1},{0, 2, 0}};
int num[5];
void work() {
	cin >> num[0] >> num[1] >> num[2];
	int ans = 0;
	for (int i = 0; i <=5; i++) {
		while (1) {
			int flag = 1;
			for (int j = 0; j < 3; j++) {
				if (num[j] - adder[i][j] < 0) {
					flag = 0;
				}
			}
			if (flag) {
				for (int j = 0; j < 3; j++) {
					num[j] = num[j] - adder[i][j];

				}
				ans++;
			} else {
				break;
			}
		}
	}
	for (int i = 0; i < 3; i++) {
		if (num[i]) {
			ans++;
			break;
		}
	}
	cout << ans << endl;
}
int main() {
	int debug=0;
	#ifdef local
		debug =1;
	#endif 
	if (debug) {
		freopen("in.txt", "r", stdin);
		freopen("out", "w", stdout);
		printf("debuging output:\n");
	}
	work();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值