https://www.lanqiao.cn/oj-contest/newbie-34/
目录
[1. 2026全年天数](#1. 2026全年天数)
[2. 年货搬运](#2. 年货搬运)
[3. 采购沙琪玛](#3. 采购沙琪玛)
[4. 分配年货](#4. 分配年货)
[5. 年货竞猜](#5. 年货竞猜)
[6. 刮刮乐卡](#6. 刮刮乐卡)
总结
第3题:取上界除法
第5题:计算时将n*(n+1)/2拆成两部分可以将一次T的时间复杂度从n降低到根号n
第6题:s.erase()用法
1. 2026全年天数
cpp
#include <iostream>
using namespace std;
int main()
{
cout << 365;
return 0;
}
2. 年货搬运
cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n, k;
cin >> n >> k;
vector<int> s(n);
for (int i = 0; i < n; i++)
{
cin >> s[i];
if (s[i] > k)
{
cout << -1;
return 0;
}
}
int ans = 0;
sort(s.begin(), s.end());
int left = 0;
int right = n - 1;
while (left <= right)
{
if (s[left] + s[right] <= k)
{
ans++;
left++;
right--;
}
else
{
ans++;
right--;
}
}
cout << ans;
return 0;
}
3. 采购沙琪玛
cpp
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int ans = 0x3f3f3f3f;
int Amax = (n + 99) / 100;
ans = min(Amax * 100, ans);
int A = n / 100;
n = max(0, n - A * 100);
int Bmax = (n + 19) / 20;
ans = min(A * 100 + Bmax * 30, ans);
int B = n / 20;
n = max(0, n - B * 20);
int C = n;
ans = min(C * 2 + B * 30 + A * 100, ans);
cout << ans;
return 0;
}
4. 分配年货
cpp
#include <iostream>
using namespace std;
void solve()
{
int n;
cin >> n;
if (n <= 2)
{
cout << -1 << endl;
return;
}
cout << n / 3 << endl;
}
int main()
{
int t;
cin >> t;
while (t--)
{
solve();
}
return 0;
}
5. 年货竞猜
计算时将n*(n+1)/2拆成两部分可以将一次T的时间复杂度从n降低到根号n

cpp
#include <iostream>
using namespace std;
#define int long long
void solve()
{
int n;
cin >> n;
int a, b;
if (n % 2 == 0)
{
a = n / 2;
b = n + 1;
}
else
{
a = n;
b = (n + 1) / 2;
}
int cntA = 0, cntB = 0;
for (int i = 1; i * i <= a; i++)
{
if (a % i == 0)
{
cntA += 2;
if (i * i == a)
{
cntA--;
}
}
}
for (int i = 1; i * i <= b; i++)
{
if (b % i == 0)
{
cntB += 2;
if (i * i == b)
{
cntB--;
}
}
}
int ans = cntA * cntB;
cout << ans << endl;
}
signed main()
{
int t;
cin >> t;
while (t--)
{
solve();
}
return 0;
}
6. 刮刮乐卡
cpp
#include <iostream>
using namespace std;
int main()
{
string s;
cin >> s;
for (int i = (int)s.size() - 2; i >= 1; i--)
{
if (s[i - 1] == 'L' && s[i] == 'Q' && s[i + 1] == 'Q')
{
s.erase(i - 1, 2);
}
}
cout << s << endl;
return 0;
}
