Codeforces Round #570
A. Nearest Interesting Number
题意
给一个 数a 找到最小的 大于等于a的一个数n 使n的各个位上的数字加起来能被4整除
思路
从a开始向大的数暴力 判断每个数是否满足条件
代码
#include<cstring>//memset
#include<iostream>//c++
#include<algorithm>//stl
using namespace std;
typedef long long ll;
int n,m,x;
string s;
int main()
{
ios::sync_with_stdio(false);
while(cin>>n)
{
while(1)
{
int b=n;
s=to_string(b);
int sum=0;
for(int i=0; i<s.size(); i++)
{
sum+=s[i]-'0';
}
if(sum%4==0)
{
cout<<n<<endl;
break;
}
n++;
}
}
return 0;
}
B - Equalize Prices
题意
给你一个数组a 问是否有一个数字B使得 数组中每个值|ai-B|<=k 没有输出-1 有 输出B的最大值
思路
如果数组中的最大值-最小值>2*k 肯定没有
如果有 最大值一定是最小值+k
代码
#include<cstdio>
#include<cstring>//memset
#include<iostream>//c++
#include<algorithm>//stl
#include<string>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<map>
#include <sstream>
#define N 100005
#define mod 1000000007
using namespace std;
typedef long long ll;
int n,m,x,te,k,t;
string s;
int main()
{
ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
int mmin=1e9,mmax=0;
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>te;
mmin=min(mmin,te);
mmax=max(mmax,te);
}
if(mmax-mmin>2*k)
cout<<-1<<endl;
else
cout<<mmin+k<<endl;
}
return 0;
}
C - Computer Game
题意
一个人拥有初始能量k 有两种耗电方式
1.当现在能量大于a时 减少a或b的能量
2.当现在能量大于b时(a>b) 减少b的能量
现在要求执行n此减少能量的过程 问是否能执行n轮 最多能执行几次减少a的过程
思路
先全部执行b判断能否执行n轮
如果可以 就类似鸡兔同笼的解决方式 先全部当成b 剩下的k-b*n 去计算能有可以把b升级成a的个数
代码
#include<cstdio>
#include<cstring>//memset
#include<iostream>//c++
#include<algorithm>//stl
#include<string>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<map>
#include <sstream>
#define N 100005
#define mod 1000000007
using namespace std;
typedef long long ll;
ll n,m,x,te,k,t,a,b;
string s;
int main()
{
ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
cin>>k>>n>>a>>b;
if(k<=n*b)
cout<<-1<<endl;
else
{
ll t=(k-n*b-1)/(a-b);
cout<<min(t,n)<<endl;
}
}
return 0;
}
D - Candy Box (easy version)
题意
给一个数字数组 现在取数字 不同数字取的个数不能相同
问最多能取的数字个数的总和
思路
先记录每个数字出现的次数 在从最高次数向下贪心 模拟当前取的个数cnt
如果下一个大于等于当前取的个数 ans+=cnt–
如果下一个小于当前取的个数 cnt=当前的次数
代码
#include<cstdio>
#include<cstring>//memset
#include<iostream>//c++
#include<algorithm>//stl
#include<string>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<map>
#include <sstream>
#define N 100005
#define mod 1000000007
using namespace std;
typedef long long ll;
ll n,m,x,te,k,t,a,b;
string s;
map<int,int> mp;
map<int,int>::iterator it;
vector<int> ve;
int main()
{
ios::sync_with_stdio(false);
cin>>t;
while(t--)
{
mp.clear();
ve.clear();
cin>>n;
for(int i=0;i<n;i++)
{
cin>>x;
mp[x]++;
}
for(it=mp.begin();it!=mp.end();it++)
{
ve.push_back(it->second);
}
sort(ve.rbegin(),ve.rend());
int ans=ve[0];
int cnt=ve[0];
for(int i=1;i<ve.size();i++)
{
if(cnt<=0)
break;
if(ve[i]>=cnt)
{
ans+=cnt-1;
cnt--;
}
else
{
ans+=ve[i];
cnt=ve[i];
}
}
cout<<ans<<endl;
}
return 0;
}
E - Subsequences (easy version)
题意
给一个字符串 问它组成k个不同的子串 需要的代价是多少 (代价为 字符串长度-子串长度)
思路
bfs暴力 每次队头是当前最长长度的子串 判断它是否出现过 同时又将他所有子串添加进队列
代码
#include<cstring>//memset
#include<iostream>//c++
#include<algorithm>//stl
#include<string>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<map>
#include <sstream>
#define N 100005
#define mod 1000000007
using namespace std;
typedef long long ll;
ll n,m,x,te,k,t,a,b;
string s,ss,ste;
map<string,int> mp;
queue<string> qu;
int main()
{
ios::sync_with_stdio(false);
cin>>n>>k;
cin>>s;
int ans=0;
while(!qu.empty())
{
qu.pop();
}
qu.push(s);
mp[s]=1;
while(!qu.empty()&&k)
{
ste=qu.front();
qu.pop();
k--;
ans+=n-ste.size();
for(int i=0;i<ste.size();i++)
{
ss=ste.substr(0,i)+ste.substr(i+1,ste.size()-i-1);
if(mp[ss]==0)
{
mp[ss]=1;
qu.push(ss);
}
}
}
if(k)
cout<<-1<<endl;
else
cout<<ans<<endl;
return 0;
}