牛客周赛 Round 4

A 游游的字符串构造

牛客周赛 Round 4_第1张图片

思路分析

构造字符串,注意k>=1

时间复杂度

O(n)

AC代码

#include
using namespace std;
int main()
{
    int n,k;
    cin>>n>>k;
    if(n>=3*k){
    for(int i=0;i<k;i++)cout<<"you";
    for(int i=0;i<n-3*k;i++)cout<<'y';
    }else cout<<-1<<endl;
    return 0;
}

B 游游的整数拆分

牛客周赛 Round 4_第2张图片牛客周赛 Round 4_第3张图片

思路分析

只要a,b中出现了3的倍数就一定满足要求。

  • 当n为3的倍数时,因为a,b为正整数,不能为0。所以要(n-1)
    牛客周赛 Round 4_第4张图片

在这里插入图片描述

时间复杂度

O(1)

AC代码:

#include 
using namespace std;
typedef long long ll;

int main() {
    ll ans=0;
    ll n;
    cin>>n;
    if(n%3!=0)ans=n/3*2;
    else ans=(n-1)/3;
    cout<<ans<<endl;
    return 0;
}

C 游游的整数操作

牛客周赛 Round 4_第5张图片牛客周赛 Round 4_第6张图片

思路分析

设minsum为累加过程中 sum 的最小值。若 ai+minsum<0, 则 minsum 一定出现在 ai最后一次变为 0 的位置.因为minsum就是最小sum,若还有更小则会更新。

  • k 次操作后, 若 ai+minsum>=0,ai一直大于0,则有 ai=a[i]+sum。
  • 若 ai+minsum<0,则中间有ai小于0,找到 在 ai最后一次变为 0 的位置minsum,有 ai=sum−minsum。(因为只需找到ai最后一次变为 0 之后的所有大于0的sum,从0开始累加的值(sum -minsum))

时间复杂度

O(n+m)

AC代码

#include 
#define int long long
const int N = 1e5 + 10,mod = 1e9 + 7;
using namespace std;
using LL = long long;
 
signed main() {
    cin.tie(0)->ios::sync_with_stdio(0);
    cout.tie(0);
 
    int n,m;
    cin >> n >> k;
 
    vector<int> a(n + 1);
    for(int i = 1; i <= n; i++) cin >> a[i];
 
    int sum = 0, minsum = 1e18;
    while(k --){
        int op, x;
        cin >> op >> x;
        if(op == 2) x = -x;
        sum += x;
        minsum = min(minsum, sum);
    }
    
    int ans = 0;
    for(int i = 1; i <= n; i++){
        if(a[i] + minsum >= 0) ans += sum + a[i];
        else ans += a[i]+sum -(a[i]+minsum); 
        ans %= mod;
    }
    
    cout << ans << '\n';
}

D 游游的因子计算

牛客周赛 Round 4_第7张图片

思路分析

为了找到ab的所有因子,可以分别求出a和b的所有因子,然后将它们的乘积作为ab的因子。首先,我们可以用一个循环遍历从1到sqrt(a)的所有正整数,找出a的因子,并将其加入到一个集合X中。同样地,也可以找出b的因子并加入到集合Y中。之后,遍历集合X中的每一个元素v,与集合Y中的每一个元素u相乘得到vu,将其加入到一个集合set中。去重

时间复杂度

O(sqrt(a) + sqrt(b))

AC代码

#include 
#include 
#include 

using namespace std;

void solve() {
    long long x, y;
    cin >> x >> y;
    vector<long long> X, Y;
    for (long long i = 1; i * i <= x; i++) {
        if (x % i == 0) {
            X.push_back(i);
            if (i * i != x) X.push_back(x / i);
        }
    }
    for (long long i = 1; i * i <= y; i++) {
        if (y % i == 0) {
            Y.push_back(i);
            if (i * i != y) Y.push_back(y / i);
        }
    }
    set<long long> s;
    for (auto v : X) {
        for (auto u : Y) {
            s.insert(v * u);
        }
    }
    cout << s.size() << '\n';
    for (auto v : s) cout << v << " ";
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    while (t--) 
        solve();
    return 0;
}

你可能感兴趣的:(算法)