Codeforces Round #582 (Div. 3):点击进入新世界
A. Chips Moving(思维)
原题链接:传送门
思路:
- 题目要求给出n个芯片在坐标上,移动2格不需要消耗硬币,移动1格消耗一块硬币,求使所有芯片位于同一坐标的最小硬币消耗量。
- 因为移动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(思维)
原题链接:传送门
思路:
- 给定n个天数的权值,若当天之后会出现比当天的权值更低的情况,则当天是糟糕的天数,求n天中的糟糕天数。
- 从后面往前面推,给定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(数学)
原题链接:传送门
思路:
- 给定n和m,求1~n中能整除m的数模10之和。
- 对于这种题目,直接模拟肯定是超时的,别问我为什么会知道?
- 一般来说是找规律 or 递推。这道题应该用递推来做,每个整除数都要对10进行取模,因此可以从乘的次数入手,先计算乘以1~9次对答案的贡献,用 d[i] 来记录 m* 1到 m* i 对答案的贡献。
(这里原本是0~9每个数字对答案的贡献,但是0或者10对答案贡献为0,因此不写出来)。 - 在n中能够整除m的数有 n/m 个,而这 n/m个数中, 有n/m/10个数完成了对 m从 1乘到10的 操作,剩下n/m%10个数完成了 对m 从1乘到 n/m%10的操作 。
- 可以得到答案为 (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;
}
虚拟参加。