题意 :就是两个相邻的数字的最大值最大是最小值的两倍,如果超过就只能再两个数字中间插数。问你最少需要多少步使数组成立
思路 :考虑如果一个max(a[i],a[i+1])如果是min(a[i],a[i+1])的两个倍以上那我就考虑把在中间插一个最大值的一半。这样所用的步数肯定是最少的。如果是奇数不能只除以2,还得加上1.
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define fhl(i,x,y) for(int i=x;i>=y;i--)
#define inf 0x3fffffff
#define ll long long
#define pb push_back
#define endl "\n"
int n;
int a[100];
void slove(){
cin>>n;
fel(i,1,n){
cin>>a[i];
}
int ans=0;
for(int i=1;i<n;i++){
int t1=max(a[i],a[i+1]);
int t2=min(a[i],a[i+1]);
while(t1>t2*2){
t1=(t1/2)+(t1%2>0);
ans++;
}
}
cout<<ans<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
slove();
}
return 0;
}
##
题意 :题意是能不能使数组中取模三后,余数为0,1,2的数的个数都是相同的,然后可以让ai=ai+1,问你最少需要多少步使得满足条件。
思路 :那我肯定考虑每次都从最近的变过来,0从2来,1从0来,2从1来。这样考虑和你从最多的转移过来本质上是一样的。(比如余数为1的最多,你让他变成0,和先让他变成2,再变成0。都是需要两步)。
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define fhl(i,x,y) for(int i=x;i>=y;i--)
#define inf 0x3fffffff
#define ll long long
#define pb push_back
#define endl "\n"
const int N=3e4+100;
int n;
int a[N];
int vis[3];
void slove(){
memset(vis,0,sizeof(vis));
cin>>n;
fel(i,1,n){
cin>>a[i];
vis[a[i]%3]++;
}
int ans=0;
while(1){
int cnt=0;
for(int i=0;i<3;i++){
if(vis[i]==n/3){
cnt++;
}
}