A 游游的字符串构造
思路分析
构造字符串,注意k>=1
时间复杂度
O(n)
AC代码
#include<bits/stdc++.h>
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 游游的整数拆分
思路分析
只要a,b中出现了3的倍数就一定满足要求。
- 当n为3的倍数时,因为a,b为正整数,不能为0。所以要(n-1)
时间复杂度
O(1)
AC代码:
#include <bits/stdc++.h>
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 游游的整数操作
思路分析
设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 <bits/stdc++.h>
#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 游游的因子计算
思路分析
为了找到ab的所有因子,可以分别求出a和b的所有因子,然后将它们的乘积作为ab的因子。首先,我们可以用一个循环遍历从1到sqrt(a)的所有正整数,找出a的因子,并将其加入到一个集合X中。同样地,也可以找出b的因子并加入到集合Y中。之后,遍历集合X中的每一个元素v,与集合Y中的每一个元素u相乘得到vu,将其加入到一个集合set中。去重。
时间复杂度
O(sqrt(a) + sqrt(b))
AC代码
#include <iostream>
#include <vector>
#include <set>
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;
}