题意:给你一个数组,任选一个下标i,并且a[i]!=a[i+1],然后删除a[i]和a[i+1]将a[i]+a[i+1]放到数组中继续操作。当a[i]==a[i+1]操作停止,求停止后的数组长度。
思路:可以发现只要数组中每个数都一样,那么不需要操作了,长度为n,只要数组中出现一个不一样的数,最终操作次数都是1
#include<bits/stdc++.h>
#define pb push_back//vector,deque
#define INF 0x3f3f3f3f
using namespace std;
const int N=2e5+5;
typedef long long ll;
int a[N];
int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int _;
cin>>_;
while(_--)
{
int n;
cin>>n;
bool flag=false;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(i>0&&a[i]!=a[i-1]&&!flag)
flag=true;
}
if(flag)
cout<<"1";
else cout<<n;
cout<<"\n";
}
return 0;
}
题意:给你一个数组,和一个k,要求k次操作,每次操作选择一个d,为该数组最大值,然后遍历数组a[i]=d-a[i]。求k次操作后打印数组。(1<=k<=1e18)
思路:对数组操作两次后发现最终数组的形态只和k的奇偶性有关
#include<bits/stdc++.h>
#define pb push_back//vector,deque
#define INF 0x3f3f3f3f
using namespace std;
const int N=2e5+5;
typedef long long ll;
int a[N];
int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int _;
cin>>_;
while(_--)
{
int n,maxx=-(1e9+5),d=-(1e9+5);
ll k;
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
maxx=max(a[i],maxx);
}
for(int i=0;i<n;i++)
{
a[i]=maxx-a[i];
d=max(d,a[i]);
}
if(k&1)
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
else
{
for(int i=0;i<n;i++)
{
a[i]=d-a[i];
cout<<a[i]<<" ";
}
}
cout<<"\n";
}
return 0;
}
题意:对一个数组a,取高度不递减的任何连续区间,进行+1操作。从右到左保证高度非递增
思路:贪心,我们只需要保证该数组是从左到右非递减就行,对于a[i]>a[i+1]的情况,对答案的贡献就是a[i]-a[i+1]
#include<bits/stdc++.h>
#define pb push_back//vector,deque
#define INF 0x3f3f3f3f
using namespace std;
const int N=2e5+5;
typedef long long ll;
int a[N];
int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
x=x*10+ch-'0',ch=getchar();
return x*f;
}
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int _;
cin>>_;
while(_--)
{
int n;
ll res=0;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=1;i<n;i++)
if(a[i-1]>a[i])
res+=a[i-1]-a[i];
cout<<res<<"\n";
}
return 0;
}