A. Vasya and Chocolate
题意:每购买a个巧克力棒,会赠送b个巧克力棒,每个巧克力棒的价格是c,
你现在有s的钱,问你最多能买到多少个巧克力棒?
做法:直接购买最多的a的倍数的巧克力棒,注意把赠送的也统计上,以及剩下的钱买最多的单个也统计上。
B. Vasya and Isolated Vertices
题意:有一个图(无重边,无自环),有N个点,M条边,问你最多和最少的孤立点有点多少个?
做法:对于最少的孤立点。考虑每条边可以连接两个点,所以M条边可以连接2*M条边,N-2*M的结果就是孤立点个数,如果为负数即没有孤立点。对于最多的孤立点,即要使得非孤立的点尽量构成完全图。对于V个点的完全图,边的个数是V*(V-1)/2,所以遍历一遍V即可。找到最大的一个V,则N-V就是最多的孤立点个数。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll get(ll x){
return x*(x-1)/2;
}
int main(void){
ll N,M;
scanf("%lld%lld",&N,&M);
ll r1,r2;
if(M*2 >= N) r1 = 0;
else r1 = N-M*2;
for(ll i=0;i<=N;++i){
if(get(i) >= M){
r2 = N-i;
break;
}
}
printf("%lld %lld\n",r1,r2);
return 0;
}
C. Make It Equal
题意:
这个题目是最难读的,就是给你N个高为hi的塔,你每次可以设置一个H,使得高于H的部分都被砍下,砍下部分的和不能大于K,问你最少砍多少次可以使得所有塔的高度达到一致。
做法:
首先,最后所有塔的高度一定是最低的那个塔的高度。这时可能会以为,直接把所以高于Min的部分加一起处以K就是结果,但这是不对的。因为每次砍剩下的高度肯定不是平均的。
这题,因为每个塔的高度都是小于2e5的所以,我们可以记录每个数出现的次数,并向下累加,表示从一个高层到底层的砍下的和。
如下代码:
#include<bits/stdc++.h>
using namespace std;
const int MAX = 2e5+10;
const int INF = 0x3f3f3f3f;
int book[MAX];
int main(void){
int N,K;
int h;
scanf("%d%d",&N,&K);
int Max = -INF,Min = INF;
for(int i=1;i<=N;++i){
scanf("%d",&h);
book[h]++;
Max = max(Max,h);
Min = min(Min,h);
}
for(int i=Max;i>=Min;--i){
book[i] += book[i+1];
}
int res = 0;
//book[i] + book[i+1],表示把上面的塔降至下一层所产生的和。因为是降到下一层的,所以这里必须是等于K.
for(int i=Max;i>Min;--i){
if(book[i] + book[i+1] <= K) book[i] += book[i+1];
else res++;
}
//如果倒数第二次还有剩余,表示要把剩下的也砍掉。
if(book[Min+1] != 0) res++;
printf("%d\n",res);
return 0;
}