社区讨论

如何O(n)

P14258好感(favor)参与者 7已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mhj0zut2
此快照首次捕获于
2025/11/03 18:57
4 个月前
此快照最后确认于
2025/11/03 18:57
4 个月前
查看原帖
赛时代码:
CPP
#include <bits/stdc++.h>
using namespace std;
long long int T,n,ans1,ans2;
string s,a,b;
int main()
{
	cin.tie( 0 );
	cout.tie( 0 );
	ios::sync_with_stdio( false );
	cin >> T;
	while( T -- )
	{
		cin >> n;
		cin >> s;
		a = s;
		b = s;
		ans1 = 0;
		ans2 = 0;
		for ( long long int i = n - 1 ; i >= 0 ; i -- )
		{
			if ( a[0] == '1' )
			{
				a[0] = '0';
				ans1 ++;
			}
			if ( b[0] == '0' )
			{
				b[0] = '1';
				ans2 ++;
			}
			if ( a[i] == '1' )
			{
				a[i] = '0';
				a = a.substr( 1 , i ) + a[0] + a.substr( i + 1 );
				ans1 += i + 1;
			}
			if ( b[i] == '0' )
			{
				b[i] = '1';
				b = b.substr( 1 , i ) + b[0] + b.substr( i + 1 );
				ans2 += i + 1;
			}
		}
		cout << min( ans1 , ans2 ) << '\n';
	}
	return 0;
}
因为substr是O(n),所以总体O(n^2)。正解应该是用O(1)插入

回复

7 条回复,欢迎继续交流。

正在加载回复...