Codeforces Round #582 (Div. 3)
B. Bad Prices
题目传送门
这道题目给我一个错觉,理解题目错觉,不过理解后也能很快做出来。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int t, n, i, j, min, count;
scanf("%d", &t);
int arr[150000];
for (i = 0; i < t; i++)
{
scanf("%d", &n);
for (j = 0; j < n; j++)
{
scanf("%d", &arr[j]);
}
count = 0;
min = arr[n - 1];
for (j = n - 2; j >= 0; j--)
{
if (arr[j] <= min)
{
min = arr[j];
}
else
{
count++;
}
}
printf("%d\n", count);
}
return 0;
}
C. Book Reading
题目传送门
这道题目,按照正常模拟肯定超时。
疯狂想其它巧妙的方法,想过这个题目的数据铁定可以得一个规律,如果按照这个规律去算那么就可以解决了。还有一个数学思维是,就是所有的n除以m那么得出的是所有可以被m整除的数的个数,那么我们再根据之前的这个规律,去算它整十的规律,还有可能剩下一些不是整除十的数据,那么就可以利用取余,然后继续算他就好。
在这个题目中,我是想到这个思路,但并没有能之间用代码实现,因为当时没有准确的方向和实现的伪代码。
以后接受教训,要学会明确一个思路,既然可以实现,那么就去构思它怎么实现,而不是乱想其它的。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--)
{
long long int n, m;
cin>>n>>m;
int ar[10];//记录循环的一个规律
long long int s = 0;
for(int i=0; i<10; i++)
{
ar[i]=((i+1)*m)%10;//每个数,得出它的规律
}
for(int i=0; i<10; i++)
{
//cout<<ar[i]<<endl;
s+=ar[i];//求出十以内的规律
}
long long int a=(n/m);//全部能够整除的数的个数
long long int ans=0;
ans+=((a/10)*s);//按照规律的那部分
for(int i=0; i<a%10; i++)//剩下一部分
{
ans+=ar[i];
}
cout<<ans<<endl;
}
return 0;
}