C. Fighting Tournament - 模拟+思维

C. Fighting Tournament - 模拟+思维_第1张图片

 C. Fighting Tournament - 模拟+思维_第2张图片

分析:

         每次两个数比较,大的留下,小的放后面,可以发现只要最大的到了第一位就只能是它赢,因此统计第一次遍历所有数组元素的赢的次数,如果查询是最大的数呢么就在加上k-n,赛时代码写的一团乱,看到别人简短的代码感觉很妙,直接简短记录每一个元素的次数,并且在查询的时候先用k将当前查询元素下标的前两位也就是i-2的元素数量减去,因为每一个元素只能是从他的前一个元素开始比较,k减去多余元素,然后将最大值的次数设置为无穷大,那么可以对任意i数都通过次数和k取最小值来得到最终答案,因为所有数的次数都只有前n轮有机会赢吃了最大的,因此都不会大于k,只有最大的时候,取减去前面无用的元素数量后恰好就是最大值k轮赢的次数。

代码:

#include 

using namespace std;

typedef long long ll;
typedef pair pii;

int main()
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);

	int _;
	cin>>_;
	while(_--)
	{
		int n,q;
		cin>>n>>q;
		vector a(n+1);
		map m;
		for(int i=1;i<=n;i++) cin>>a[i];
		int x=1;
		for(int i=2;i<=n;i++)
		{
			if(a[i]>a[x]) x=i;
			m[x]++;
		}
		m[x]=0x3f3f3f3f;
		while(q--)
		{
			int i;
			ll k;
			cin>>i>>k;
			k-=max(i-2,0);
			cout<

你可能感兴趣的:(算法,c++,模拟)