codeforces 1217 A.Creating a Character ,B. Zmei Gorynich

A.Creating a Character       

题目链接codeforces 1217A

题意:

   给定 m, n , exp ,问将exp 分配给 m和 n 保证    m > n 有多少种分法

题解:

   设给 m 加 addm , 则      m + addm >   n + (exp - addm)           

  2*addm > n + exp -  m

  2 * addm > n + exp - m + 1 

  addm >  (n + exp - m + 1 ) / 2;

因为要向下取整 , 所以 addm >  (n + exp - m + 2 ) / 2;

所以最少给m 加(n + exp - m + 2 ) / 2

ans = max(exp - addm + 1, 0);

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
	int t;
	cin >> t;
	while(t--){
		int m, n, exp;
		cin >> m >> n >> exp;
		int addm = max(0, (n+exp-m+2) / 2);
		int ans = max(0, exp - addm + 1);
		cout << ans << endl;
	}
	return 0;
}

 

 

B. Zmei Gorynich

题目链接:codeforces 1217B

题意:

   给 n 把刀, 怪物头为 m 个   ,然后每把刀可以砍掉怪物 Xi 个头,长出 Yi  个头,问最少操作多少次

题解:

   思维题, 只用考虑最后一次砍掉最多的,然后其他的时候砍掉的头减去长出来的头差值最大

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
	int t;
	cin >> t;
	while(t--){
		int n, m, k, h, maxk = 0, maxd = -999999999;
		cin >> n >> m;
		for(int i = 1; i <= n; i++){
			cin >> k >> h;
			if(k > maxk){
				maxk = k;       // 砍掉的头最多
			}
			if(k - h > maxd){
				maxd = k - h;  // 砍掉和长出来的差值最大
			}
		}
		int ans = 1;
		m = m - maxk;        // 最后一次砍掉最多
		if(m > 0){
			if(maxd <= 0){   // 如果差值为负,不可能砍完
				ans = -1;
			}
			else{
				ans = ans + (m + maxd - 1) / maxd;
			}
		}
		cout << ans << endl;
	}
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值