Codeforces Round #582(A-D2)题解

A. Chips Moving

题目链接:http://codeforces.com/contest/1213/problem/A

题意:简单题意,就是说有n个数,两种操作:其一,你可以将任意一个数xi变为xi+2或者xi-2这种操作没有代价,其二,你可以将任意一个数xi变为xi+1或者xi-1但是代价为1,问将这n个数变为相同的数得最小代价。

思路:统计奇数偶数个数取最小值即可。

代码:

#include
using namespace std;
const int maxn=1e2+5;
int a[maxn];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int odd=0,even=0;
        for(int i=0;i

B. Bad Prices

题目链接:http://codeforces.com/contest/1213/problem/B

题意:求坏的天数,定义为:存在在第i天之后卖的书的价格更低,则第i天定义为坏的天数。

思路:从后往前找,记录最小值即可。

代码:

#include
using namespace std;
const int maxn=2e5+5;
const int INF=0x3f3f3f3f;
int a[maxn];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        for(int i=0;i=0;i--)
        {
            if(a[i]>num) ans++;
            else num=a[i];
        }
        printf("%d\n",ans);
    }
    return 0;
}

C. Book Reading

题目链接:http://codeforces.com/contest/1213/problem/C

题意:求1-n中能被m整除得数的最后一位数之和。

思路:数学不好只能打表找规律,对于偶数、5这个数以及剩下奇数分别处理即可。

代码:

#include
using namespace std;
const int maxn=1e5+5;
typedef long long LL;
int main()
{
    int q;
    scanf("%d",&q);
    while(q--)
    {
        LL n,m;
        cin>>n>>m;
        int cnt=m%10;
        if(cnt==0)
        {
            puts("0");
            continue;
        }
        if(cnt==5)
        {
            LL num=n/m;
            int mod=num%2;
            num/=2;
            LL sum=num*5;
            if(mod) sum+=5;
            printf("%lld\n",sum);
            continue;
        }
        if(cnt&1)
        {
            LL num=n/m;
            int mod=num%10;
            num/=10;
            LL sum=num*45;
            for(int i=1;i<=mod;i++) sum+=m*i%10;
            cout<

D1. Equalizing by Division (easy version)&&D2. Equalizing by Division (hard version)

题意:给定n和k,对于n个数,有一种操作,对于a[i],每次可以将a[i]变为a[i]/2向下取整,代价为1,求经过变换之后相同元素个数为k的最小代价。

思路:直接排个序,然后对这个数进行变换,变换过程中记录这个数的代价、变换后的数的代价以及相应的元素个数记录,对满足条件的答案记录一个最小值即可。

代码:

#include
using namespace std;
#define INF 0x3f3f3f3f
const int maxm=2e5+5;
int a[maxm],num[maxm],ans[maxm];
int main()
{
    int k,n;
    while(~scanf("%d%d",&n,&k))
    {
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        sort(a+1,a+n+1);
        memset(num,0,sizeof(num));
        memset(ans,0,sizeof(ans));
        int cnt=INF;
        for(int i=1;i<=n;i++)
        {
            int temp=0;
            while(a[i])
            {
                num[a[i]]++;
                ans[a[i]]+=temp;
                if(num[a[i]]==k) cnt=min(cnt,ans[a[i]]);
                temp++;
                a[i]>>=1;
            }
        }
        printf("%d\n",cnt);
    }
    return 0;
}

 

你可能感兴趣的:(Codeforces)