A.Pokémon Army (easy version)
题意:状态定义f[i]:f[0]表示不选,f[1]表示选择。
状态转移f[1]=f[0]+a,f[0]=f[1]-a。最终答案为f[1],因为最后一位为加的答案肯定大于为减的。
#include <iostream>
using namespace std;
const int N=3e5+10;
long long f[2];
int main()
{
int t;
cin>>t;
while(t--)
{
f[0]=f[1]=0;
int n,p;
cin>>n>>p;
for(int i=1;i<=n;i++)
{
int a;
cin>>a;
f[1]=max(f[0]+a,f[1]);
f[0]=max(f[1]-a,f[0]);
}
cout<<f[1]<<endl;
}
return 0;
}
B.String Reversal
题意:求最少次相邻数字的交换后,得到翻转后的串。
交换相邻数字,就可以想到求逆序对的数量,同时,将数字正确位置,按升序分配给相同数字(贪心),然后用树状数组求逆序对
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
const int N=2e6+100;
int n;
char a[N],b[N];
vector<int> pos[30];
ll num[N],pp[N];
ll tree[N];
ll lowbit(ll k) {
return k&-k;}
void