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