A. Nearest Interesting Number
题意:找到第一个大于a并且它的每一位累和之后可以整除4。
思路:模拟,从a+1开始遍历,找到满足条件的跳出循环。
AC代码:
#include <bits/stdc++.h>
typedef long long LL;
const int maxx=1e5+10;
using namespace std;
int a[maxx];
int solve(int x)
{
int res=0;
while(x)
{
res+=x%10;
x=x/10;
}
return res;
}
int main()
{
int a;
cin>>a;
int f=0;
for(int i=a;i<=9999;i++)
{
//cout<<solve(i)<<endl;
if((solve(i)%4)==0)
{
f=i;
break;
}
}
cout<<f<<endl;
}
B. Equalize Prices
题意:给你一个数组a,长度为n,要你求一个数,这个数满足他和数组中所有元素的差的绝对值小于等于k,并且是满足这个条件中最大的那一个。
思路:将数组排序,如果K特别大,大于a[n],则能达到的最大值是a[1]+k。
如果a[n]-k大于a[1]+k,则不能实现。遍历下降的高度,找满足的最大值。
AC代码:
#include <bits/stdc++.h>
typedef long long ll;
const int maxx=1e5+10;
using namespace std;
ll a[105];
int main()
{
ll q,n,k;
cin>>q;
while(q--)
{
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+1+n);
ll d=a[n]-a[1];
if(k>=a[n])
{
cout<<a[1]+k<<endl;
}
else
{
ll ans=0;
if(d<=2*k)
{
for(int i=k;i>0;i--)
{
if((d-i)<=k)
{
ans=a[1]+i;
break;
}
}
cout<<ans<<endl;
}
else
{
cout<<"-1"<<endl;
}
}
}
}
C. Computer Game
题意:电池剩余电量k,要使用电脑玩n轮游戏,玩游戏消耗电量a,边充电边玩消耗电量b。如果n轮任务不能完成输出-1。否则,输出最多可以玩几轮不充电消耗电量a的。(最多n轮)
思路:1.:如果电量减去所有轮数使用b方法消耗电量剩余电量还是小于等于0,就输出-1,代表没有使用a方法,且不能完成n轮任务。
2.:设玩a种x轮,则。
化简得:。
注意:,x要减一。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int t;
ll k,n,a,b;
cin>>t;
while(t--)
{
cin>>k>>n>>a>>b;
if((k-n*b)<=0)
{
cout<<"-1"<<endl;
}
else
{
ll ans=(k-n*b)/(a-b);
if(((k-n*b)%(a-b))==0)
ans--;
cout<<min(n,ans)<<endl;
}
}
}
D. Candy Box (easy version)
题意:你现在有 n个糖果,第 i 个糖果的种类是 a i。你要把这些糖果送给别人,你要取出同一种类的小于等于该类糖果总数的数量,你下一次送给别人糖果时,你取出的这个种类的糖果数不能和你上一个送出的糖果数相同,问你最多能送出多少个糖果。
思路:排序加贪心,遍历一遍,从最大的个数开始送,当前值和上一个送的数量(pre)的一样,那就少送一个(pre-1),否则全送出去。
AC代码:
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int a[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,x;
cin>>n;
for(int i=0;i<=n;i++)
a[i]=0;
for(int i=1;i<=n;i++)
{
cin>>x;
a[x]++;
}
sort(a+1,a+n+1);
ll ans=a[n];
int pre=a[n];
for(int i=n-1;i>=1;i--)
{
if(a[i]==0)
break;
if(a[i]<pre)
{
ans+=a[i];
pre=a[i];
}
else
{
ans+=pre-1;
pre--;
}
if(pre==0)
break;
}
cout<<ans<<endl;
}
}
E. Subsequences (easy version)
题意:给你一个长度为n的字符串,找出其中k个不同子序列(可不连续),使得代价(删除字符数)最小。
思路:BFS+set去重
每次删除一个字符,若set不存在,更新队列与set。