9.21 Codeforces Round #582 (Div. 3)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/JiangHxin/article/details/101158847

Codeforces Round #582 (Div. 3):点击进入新世界

A. Chips Moving(思维)

原题链接:传送门

思路:

  1. 题目要求给出n个芯片在坐标上,移动2格不需要消耗硬币,移动1格消耗一块硬币,求使所有芯片位于同一坐标的最小硬币消耗量。
  2. 因为移动2格不需要消耗硬币,像1到3 / 2到4 / 1到5 / 2到6 ,因此只需要计算出偶数和奇数个数,输出两者的较小值即可。

    代码如下:
#include<bits/stdc++.h>
#define pi 3.1415926535898
using namespace std;
int main()
{
    int n,x,ans1=0,ans2=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        if(x%2) ans1++;
        else ans2++;
    }
    cout<<min(ans1,ans2);
    return 0;
}


B. Bad Prices(思维)

原题链接:传送门

思路:

  1. 给定n个天数的权值,若当天之后会出现比当天的权值更低的情况,则当天是糟糕的天数,求n天中的糟糕天数。
  2. 从后面往前面推,给定res比任何天数权值大,如果res<a[i],则糟糕天数ans++;否则更新res=a[i]。

AC代码如下:

#include<bits/stdc++.h>
#define pi 3.1415926535898
using namespace std;
const int manx=150005;
int a[manx];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,ans=0,res=1000005;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        for(int i=n;i>=1;i--){
            if(a[i]>res) ans++;
            res=min(res,a[i]);
        }
        printf("%d\n",ans);
    }
    return 0;
}


C. White Sheet(数学)

原题链接:传送门

思路:

  1. 给定n和m,求1~n中能整除m的数模10之和。
  2. 对于这种题目,直接模拟肯定是超时的,别问我为什么会知道?
  3. 一般来说是找规律 or 递推。这道题应该用递推来做,每个整除数都要对10进行取模,因此可以从乘的次数入手,先计算乘以1~9次对答案的贡献,用 d[i] 来记录 m* 1到 m* i 对答案的贡献。
    (这里原本是0~9每个数字对答案的贡献,但是0或者10对答案贡献为0,因此不写出来)。
  4. 在n中能够整除m的数有 n/m 个,而这 n/m个数中, 有n/m/10个数完成了对 m从 1乘到10的 操作,剩下n/m%10个数完成了 对m 从1乘到 n/m%10的操作 。
  5. 可以得到答案为 (n/m/10)*d[9] + d[n/m%10] 。

AC代码如下:

#include<bits/stdc++.h>
#define pi 3.1415926535898
using namespace std;
typedef long long ll;
ll d[10];
int main()
{
    ll n,m;
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        for(int i=1;i<=9;i++) d[i]=(m*i)%10,d[i]+=d[i-1];
        cout<<(n/m/10)*d[9]+d[n/m%10]<<endl;
    }
    return 0;
}


虚拟参加。

猜你喜欢

转载自blog.csdn.net/JiangHxin/article/details/101158847