Codeforces Round #570 (Div. 3) a-e

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值