蓝桥杯 2.北伐军费【算法赛】 题型:找规律思维题 (一次过)

87 阅读1分钟

2.北伐军费【算法赛】 - 蓝桥云课 (lanqiao.cn)

样例解析

诸葛亮取最大的3,此时数组变为了-1,2.然后刘禅取最小的-1,此时数组变为了-2.最后诸葛亮再把-2取了.

ans就等于诸葛亮的价值和-刘禅的价值和. image.png

我刚开始想着每个人取完一个元素之后下个人取之前都要重新给每个元素取反,这样的复杂度太大了。

其实我们可以用一个伪标记位,对于每一个人如果这次不变,那么下次就要变,这种方法就可以实现。

#include <bits/stdc++.h>
using namespace std;
int n;
const int N = 1e3+10;
int a[N], b[N];
int A, B;

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	for (int i = 1; i <= n; i += 2)
		A += a[i];
	for (int i = 2; i <= n; i += 2)
		B += -a[i];

	cout << A - B << endl;
	return 0;
}

image.png

#include<iostream>
#include<algorithm>
using namespace std;

const int N=1e3+10;
int a[N];
void solve()
{
	int n;cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	
	sort(a+1,a+n+1,greater<int>());
	

  // for(int i=1;i<=n;i++)cout<<a[i]<<" ";
  // cout<<endl;

	int A=0,B=0;
	int flag1=1,flag2=1;

int i=1;
while(i<=n)
{
  if(flag1==1)
  {
    A+=a[i];
    B-=a[i+1];
    //cout<<"A1: "<<A <<" "<<B<<endl;
    i+=2;
    flag1=0;
  }
  else
  {
    A+=a[i];
    B-=a[i+1];
    //cout<<"A2: "<<A<<" "<<B<<endl;
    i+=2;
    flag1=1;
  }

}
	cout<<A-B<<endl;
}
int main()
{
	
	solve(); 
	return 0;
}

image.png