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;
}

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务