atcoder ABC152

本次共六题。A,B过于简单忽略。C题真不知道为啥卡了半小时。现在来重新整理一下思路。
atcoder ABC152_第1张图片
一开始的思路就是每个数前面所有数比较,求出比前面的数都小的数目,但O(n*n)的复杂度是肯定会超时的。

于是不知怎么的我又觉得这个数目与这串排列的逆序数有关,于是我又去找答案与该排列逆序数之间的关系,找了很久也没找到。

折腾近20分钟,突然发现我每个数只需与它前面最小的数比较即可,于是复杂度就可简化到O(n)。问题便解决了。

本题给我两个启示1.比较过程往往考虑能否用记录最大值或最小值比较,不必每次比较。2.发现复杂度过大时,应考虑如何减少它的复杂度。

D题 !!重要
atcoder ABC152_第2张图片
这题的大致意思就是找到小于等于N的第一个数字与最后一个数字相反的数对的总数。如13与31,123与321都是这样的数对。
我的第一想法是打表,第一想到不是多测试样例,第二我连打表的思路也想不到,于是打表的想法只能暂时放下。
第二天我看了看别人的解答,大概明白思路了。
这是别人的AC代码

#include
using namespace std;
int n;
int find_p(int x) {
	int tmp=x;
	while(tmp>=10) tmp/=10;
	return tmp;
}
int ans=0,c[20][20];
int main()
{
	memset(c,0,sizeof(c));
	scanf("%d",&n);
	for(int i=1;i<=n;++i) {
		int j=find_p(i),k=i%10;
		c[j][k]++;
	}
	for(int i=0;i<=9;++i)
		for(int j=0;j<=9;++j)
			ans+=c[i][j]*c[j][i];
	printf("%d",ans);
	return 0;
}

这道题给我的启示是我们要学会抓住数据的关键点,也就是有用的地方。对于所有小于等于N的正整数,我们需要的或者说对于我们有意义

的只是他们的第一位与最后一位。而第一位与最后一位相反的就可以组合成我们想要的一组数据。因此我们用二维数组c[10][10]存入对应首

尾数字的个数即可算出对应能够组合成的数对的个数。

!!从数据中抓取我们需要的部分再做处理。
E,F就算了拜拜。

你可能感兴趣的:(atcoder)