题意:一个数组,每次可以将后k个数的值赋给前k个数,问最少多少次可以将数组所以值相等。
题解:由于是将后k个数赋给前k个数,最终的状态一定是所有数都等于数组最后一个数,再由最后一个数向前推,当遇到不相等的数时,成倍数的覆盖赋值。
注:由于for循环每次会i--。故当遇到不相等的数时i=i-l+1;
体会:根据初态推出末态,再由末态向前推过程。
代码如下:
#include#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); #define int long long #define endl 'n' #define N 500005 using namespace std; const int inf=0x3f3f3f3f; const double ex=1e-7; const int mod=1e9+7; int gcd(int a ,int b){ return b ? gcd(b,a%b) : a ;} typedef pair PII; int a[N]; void solve() { int n; cin >>n; for(int i=1;i<=n;i++) { cin >>a[i]; } int l=1,ans=0; for(int i=n-1;i>=1;i--) { if(a[i]!=a[n]) { i=i-l+1;ans++;l*=2; }else{ l++; } } cout <>t; while(t--) { solve(); } return 0; }



