Codeforces Round #582 (Div. 3)

Posted emcikem

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #582 (Div. 3)相关的知识,希望对你有一定的参考价值。

A Chips Moving

传送门
就是一堆木块,你需要做的是把某个木块±2或者±1,但是±1需要硬币。使得最后全部数相同
分析发现,所以奇数可以通过±2得到相同,所有偶数也是,所以,最后只要把奇数或偶数变成一样的数即可,那么也就是求奇数和偶数的最小个数。

#include <iostream>
#include <cstdio>
using namespace std;
int main()
    int n;
    cin>>n;
    int e=0,o=0;
    while(n--)
        int x;
        cin>>x;
        if(x&1)o++;
        else e++;
    
    printf("%d\n",min(o,e));
    return 0;

B Bad Prices

传送门
bad price 是指如果第天的价格是a,那么之后的价格如果小于a,那么第i的价格a就是bad price
我们选择的方法是从后面开始记录,不断更新最小值,然后如果该天的价格大于当前最小值,那么就是一个bad price

#include <iostream>
#include <cstdio>
#define ll long long
#define il inline
using namespace std;
const int N=150005;
inline ll read()
    char ch=getchar();ll x=0,f=1;
    while(ch<'0'||ch>'9')if(ch=='-')f=-1;ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0';ch=getchar();
    return x*f;

int main()
    ll t;
    cin>>t;
    while(t--)
        ll n;
        scanf("%lld",&n);
        ll a[N];
        for(int i=0;i<n;i++)
            scanf("%lld",&a[i]);
        

        int ans=0;
        int minn=1e6+5;
        for(int i=n-1;i>=0;i--)
            if(a[i]>minn)
                ans++;
            else
                minn=a[i];
            
        

        printf("%d\n",ans);

    
    return 0;

C Book Reading

传送门

方法一

利用数字的特点,因为数字太大,枚举是不可能的。但是只需要把[1,n]里所有m的倍数的个位数相加即可,那么只需要找出所有个位数的规律,以及有几个m的倍数属于[1,n]

#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
ll a[]=2,4,6,8,0;
ll b[]=3,6,9,2,5,8,1,4,7,0;
ll c[]=4,8,2,6,0;
ll d[]=5,0;
ll e[]=6,2,8,4,0;
ll f[]=7,4,1,8,5,2,9,6,3,0;
ll g[]=8,6,4,2,0;
ll h[]=9,8,7,6,5,4,3,2,1,0;
ll j[]=1,2,3,4,5,6,7,8,9;
int main()
    int t;
    cin>>t;
    while(t--)
        ll n,m;
        cin>>n>>m;
        ll sum=0;
        ll x=n/m;
        switch(m%10)
            case 1: sum=45*(x/10);for(int i=0;i<x%10;i++)sum+=j[i];break;
            case 2: sum=20*(x/5);for(int i=0;i<x%5;i++)sum+=a[i];break;
            case 3: sum=45*(x/10);for(int i=0;i<x%10;i++)sum+=b[i];break;
            case 4: sum=20*(x/5);for(int i=0;i<x%5;i++)sum+=c[i];break;
            case 5: sum=5*(x/2);for(int i=0;i<x%2;i++)sum+=d[i];break;
            case 6: sum=20*(x/5);for(int i=0;i<x%5;i++)sum+=e[i];break;
            case 7: sum=45*(x/10);for(int i=0;i<x%10;i++)sum+=f[i];break;
            case 8: sum=20*(x/5);for(int i=0;i<x%5;i++)sum+=g[i];break;
            case 9: sum=45*(x/10);for(int i=0;i<x%10;i++)sum+=h[i];break;
        

        printf("%lld\n",sum);
    
    return 0;

方法二:

以上是关于Codeforces Round #582 (Div. 3)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #582 (Div. 3)

Codeforces Round #582 (Div. 3) 解题记录

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)

Codeforces 582AGCD Table

Codeforces Round #726 (Div. 2) B. Bad Boy(贪心)