水题
#include<bits/stdc++.h>
using namespace std;
#define xiao chu \
ios::sync_with_stdio(false) \
cin.tie(0),cout.tie(0);
typedef long long LL;
typedef pair<int,int>PII;
const int N=1e5+10;
int n,m,a[N];
signed main()
{
int T;
cin>>T;
while(T--)
{
bool st[N]={false};
int x;
cin>>x;
int sum=0;
memset(a,0,sizeof(a));
for(int i=1;i<=x;i++) cin>>a[i];
for(int i=1;i<=x;i++)
{
int k=a[i],ct=0;
while(!st[k])//主体部分
{
st[k]=1;
k=a[k];
ct++;
}
if(ct>0)
{
sum+=ct-1;//别忘了减一操作 比如两个交换了上边会记录一 直接减一
}
}
cout<<sum<<endl;
}
}
5,8,9,10;
第一次,除了一号,其他全减5(10-5) 5 3 4 5; 操作五次
第二次,除了二号,其他全减2(5-3) 3 3 2 3; 操作两次
第三次,除了三号,其他全减1(3-2) 2 2 2 2; 操作一次
第一个最矮,留着不动,其余n-1盆都减去mx-mi。修剪完之后我们发现,第一盆,和最高的那一盆一样高了,第二盆变成了最矮的。然后我们再把第二盆留着不动,继续修剪其它的。修剪完后第三盆又变成了最矮的。依次类推......而且在这个过程中,最后一盆一直都是最高的。最矮的位置从第一盆依次移动到第n-1盆。
即从前向后,每个花盆与最后花盆(最高的)的高度差全部加起来,就是最后那个花盆要修剪的高度。如果修剪 高度sum大于原本的高度值mx,那么就成负数了。所以当mx-sum>=1就能修剪成功,最小次数就是mx-sum(每次只能修剪一米)。如果mx-sum<1,输出-1即可。
#include<bits/stdc++.h>
using namespace std;
#define xiao chu \
ios::sync_with_stdio(false) \
cin.tie(0),cout.tie(0);
typedef long long LL;
typedef pair<int,int>PII;
const int N=1e5+10;
int n,m,a[N];
signed main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
int max1=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
max1=max(max1,a[i]);
}
int ans=0;
for(int i=1;i<=n;i++)
{
ans+=max1-a[i];
}
if(max1-ans>0) cout<<max1-ans<<endl;
else cout<<"-1"<<endl;
}
}
连续字符统计
这题发现最后是一个规律题 加上他们等差数列的结果
等差数列(a1+an)*n/2;
#include<bits/stdc++.h>
using namespace std;
#define xiao chu \
ios::sync_with_stdio(false) \
cin.tie(0),cout.tie(0);
typedef long long LL;
typedef pair<int,int>PII;
const int N=1e5+10;
int n,m,a[N];
signed main()
{
int T;
cin>>T;
while(T--)
{
string s;
cin>>s;
LL ans=0;
for(int i=0;i<s.size();i++)
{
LL cnt=1;
while(s[i+1]&&s[i]==s[i+1])//连续字符统计 别忘了还有一个 s[i+1]不能到最后 s[i]==s[i+1]
{
cnt++;
i++;
}
ans +=((1+cnt)*cnt)/2;//等差求和
}
cout<<ans<<endl;
}
}