A:种花问题

知识点:数组、贪心

思路:从左向右遍历花坛,在可以种花的地方就种一朵,能种就种(因为在任一种花时候,不种都不会得到更优解),就是一种贪心的思想 这里可以种花的条件是:

自己为空 左边为空 或者 自己是最左 右边为空 或者 自己是最右 若是这几种情况则统计一朵花,最后看看是否达标即可。

参考代码:

#include<bits/stdc++.h>
using namespace std;
int n,a[20001],ans,k;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }cin>>k;
    for(int i=1;i<=n;i++){
        if((i==1||!a[i-1])&&!a[i]&&(i==n||!a[i+1])){
            a[i]=1;
            ans++;
        }
    }
    cout<<(ans>=k);
    return 0;
}

B:字符串的最大公因子

知识点:最大公约数、字符串

思路:如果存在一个符合要求的字符串 X,那么也一定存在一个符合要求的字符串 X',它的长度为 str1 和 str2 长度的最大公约数。我们可以先用辗转相除法求得两个字符串长度的最大公约数 gcd(len1,len 2),取出该长度的前缀串,判断一下它是否能经过若干次拼接得到 str1 和 str2 即可。

代码:

#include<bits/stdc++.h>
using namespace std;
string str1,str2;
string f(string s1,string s2){
    if(s1+s2!=s2+s1) return "";
    return s1.substr(0,__gcd(s1.size(),s2.size()));
}
int main() {
    cin>>str1>>str2;
    cout<<f(str1,str2);
    return 0;
}

C:接雨水

知识点:左右指针

思路:对于某一位置的接水量,蓄水量取决于左右最高柱子的最小值,和当前位置高度的差值,也就是说,对于每个位置的水量,我们只需向左向右找到最高的柱子,取其中的最小值,然后按照公式: min(lmax, rmax)-a[i]累加计算即可。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,a[20001],l,r,lmax,rmax,ans;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    l=1;r=n;
    lmax=max(a[1],lmax);
    rmax=max(a[n],rmax);
    while(l<r){
        lmax=max(lmax,a[l]);
        rmax=max(rmax,a[r]);
        if(lmax<rmax) ans+=min(lmax,rmax)-a[l++];
        else ans+=min(lmax,rmax)-a[r--];
    }
    cout<<ans;
    return 0;
}

D:联合权值

知识点:数学完全平方公式、图论

思路:1、联合的两个节点距离为二,所以必定有一个中转点。所以,我们可以枚举每一个中转点(使用vector容器来进行,该点作为中转,该点连接的其余个点自然就是两条边)。

2、假设每个中转点周围有两个点,权值分别为a、b,则联合权值为2ab=(a+b)^2-(a^2+b^2)。

3、若有三个点,权值分别为a、b、c,则联合权值为2ab+2bc+2ac=(a+b+c)^2-(a^2+b^2+c^2)。

4、综上,以某个节点为中转点的联合权值之和等于权值和的平方减去权值的平方和。

5、为了找到最大的联合权值,只需找到周围最大的两个权值max1,max2,相乘判断即可。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,w[200005];
vector<int> a[200005];
long long ans1,ans2;
int main(){
    cin>>n;
    for(int i=1;i<n;i++){
        int x,y;cin>>x>>y;
        a[x].push_back(y);
        a[y].push_back(x);
    } 
    for(int i=1;i<=n;i++)cin>>w[i];
    for(int i=1;i<=n;i++){
        long long s1=0,s2=0,m1=0,m2=0;//m1为1大m2为2大 
        for(int j=0;j<a[i].size();j++){
            s1+=w[a[i][j]];//所有数值和
            s2+=w[a[i][j]]*w[a[i][j]];//所有数值平方和
            if(w[a[i][j]]>m1) m2=m1,m1=w[a[i][j]];
            else if(w[a[i][j]]>m2) m2=w[a[i][j]];
        }
        ans1=max(ans1,m1*m2);
        ans2+=s1*s1-s2;
        ans2%=10007;
    }
    cout<<ans1<<' '<<ans2;
    return 0;
}
Copyright ©图灵之星 2024,转载需注明出处该文件修订时间: 2025-03-13 15:42:53

results matching ""

    No results matching ""