基于java的算法题总结

水题

#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;
}

 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值