A - Nearest Interesting Number
题意:
找一个各个位数之和的可以被4整除的,而且从他给的a开始最小的的一个。
题解:
求每一位数字之和,然后开始遍历直到能被4整除即可。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a;
cin>>a;
int i=a,s=0;
while(1)
{
a=i;
while(a!=0)
{
s=s+a%10;
a=a/10;
}
if(s%4==0)
{
break;
}
i++;
s=0;
}
cout<<i<<endl;
return 0;
}
B - Equalize Prices
题意:
给一个数组,可以把每个元素的值改成[a-k,a+k]以内,使得每个元素相等,求最大值。
题解:
题目说要求最大的价格那就是最小值+k就行了,数学就可以解,用二分就有点麻烦了
#include <iostream>
#include <algorithm>
using namespace std;
int a[110];
int main() {
int q;
cin>>q;
while(q--) {
int n, k;
cin>>n>>k;
for(int i = 1; i <= n; i++) cin>>a[i];
sort(a + 1, a + n + 1);
if(a[n] - a[1] > k + k) cout<<-1<<endl;
else cout<<a[1]+k<<endl;;
}
}
Computer Game
题意:
q组询问,每组询问给出四个数k , n , a , b 初始有k的能源,要进行n回合,你可以在能源严格大于a 的时候进行一回合(第一种),在能源严格大于b的时候进行一个回合。问你最多可以进行几次第一种回合。若无法完成n轮,输出-1.
题解:
#include <cstdio>
#include <iostream>
#define ll long long
using namespace std;
int main() {
int q;
cin>>q;
while(q--) {
ll a, b, k, n;
cin >> k >> n >> a >> b;
int tmp = (k - b * n - 1) / (a - b);
if(b * n >= k) cout<<-1<<endl;
else {
cout << (n <= tmp ? n : tmp) << endl;
}
}
}
Candy Box (easy version)
题意:
q次询问,每次询问给出n个数,让你从这给数列找一组数,使得没有出现相同次数的两种数,问最多几个。
题解:
贪心模拟就行。按每个数出现的次数排下序,然后直接加即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
bool cmp(int a,int b)
{
return a > b;
}
int a[200005];
int b[200005];
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int i=0;i<=n;i++){
a[i]=0;
}
for(int i=0;i<=n;i++){
b[i]=0;
}
for(int i = 1;i <= n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
int cnt = 1;
int tmp = a[1];
for(int i = 1;i <= n;i++)
{
if(a[i] == tmp)
{
b[cnt]++;
}else
{
tmp = a[i];
cnt++;
b[cnt]++;
}
}
if(b[cnt] == 0) cnt--;
sort(b+1,b+cnt+1,cmp);
int now = b[1];
int ans = 0;
for(int i = 1;i <= cnt;i++)
{
ans += now;
now = max(0,min(now-1,b[i+1]));
}
cout<<ans<<endl;
}
return 0;
}