- 西中经开联校 - 第 3 场周赛
【题解】西中经开联校 - 第 3 场周赛
- 2024-12-24 15:47:20 @
T1 凑数
难度:学过输入输出就可以拿到满分。
满分做法:题目要求我们输出三个非负整数 ,使得 。可能有多种答案,而我们只需要输出其中一种即可。又根据 的范围得知, 一定是大于等于 的正整数。所以 这个数必然可以被拆分成 三个数,我们直接输出这三个数就可以啦。
C++ 代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
cout << 1 << " " << 1 << " " << n - 2 << endl;
return 0;
}
T2 开三方
难度:掌握单层循环语句,并且了解次方的数学含义。就可以拿到满分。
满分做法:根据题意 即 。又因为 ,所以我们只需要从小到大枚举 的值,找到第一个满足 的解。
注:本题数据范围较大,要把变量定义成 long long
类型!!!
C++ 代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n;
cin >> n;
for (int i = 1; ; i ++ )
{
if (1LL * i * i * i > n)
{
cout << i - 1 << " " << i << endl;
break;
}
}
return 0;
}
T3 比大小
难度:需要熟练掌握分支、字符串以及字典序才可以拿到满分。
分做法:对于 % 的数据, 均在 int
的范围之内,使用整型来存储和比较即可。
满分做法:对于 % 的数据, 显然无法再使用 int
或 long long
进行存储,需要将 定义成字符串来储存,而字符串之间的关系运算已不符合数值之间的运算规则,我们需要思考所有可能的情况,进行分类讨论:
(1)两数相等,输出 “”,则对应的字符串也应完全一致,我们可以通过 “” 直接进行判断。
(2)第一个数是负数,第二个数是正数,即 a[0]
是 '' ,b[0]
不是 '' 时输出 ""。
(3)第一个数是正数,第二个数是负数,即 a[0]
不是 '' ,b[0]
是 '' 时输出 ""。
(4)两个数同正或者同负。
同正,即 a[0]
不是 '' 且 b[0]
也不是 '' 。先判断一下两个数的位数(字符串长度)是否相等。如果不等,则位数大的数值本身也一定更大。如果位数相等,则可以比较字典序,字典序大的数值更大。然后根据结果输出对应的语句即可!
同负,即 a[0]
是 '' 且 b[0]
也是 ''。判断原理同上,但结果相反。
C++ 代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string a, b;
cin >> a >> b;
if (a == b) cout << "same" << endl; // 相等
else if (a[0] == '-' && b[0] != '-')
cout << "second" << endl; // 一负一正
else if (a[0] != '-' && b[0] == '-')
cout << "first" << endl; // 一正一负
else if (a[0] != '-' && b[0] != '-')
{
// 两个正数
if (a.length() < b.length() ||
(a.length() == b.length() && a < b))
cout << "second" << endl;
else
cout << "first" << endl;
}
else
{
// 两个负数
if (a.length() < b.length() ||
(a.length() == b.length() && a < b))
cout << "first" << endl;
else
cout << "second" << endl;
}
return 0;
}
T4 吃桃子
难度:需要熟练掌握结构体、 sort
排序和贪心思想。
满分做法:为了吃到最多的桃子,我们的策略是优先吃最开胃的桃子,因为这样能吃到尽可能多的桃子,必然开心程度也就高。而如果有相同开胃值的桃子,我们要优先吃其中开心值最高的桃子。
具体实现为,首先定义一个结构体,其中包括桃子的开胃值和开心值。因为我们要先按开胃值从大到小排序,开胃值相等时再按开心值从大到小排序。那么我们可以用 sort
排序,通过自定义 cmp
函数来处理这种二级排序的问题。在排序之后,我们就可以从头到尾模拟吃桃的过程,最后算出最大的开心程度即可得到答案。
C++ 代码:
#include <bits/stdc++.h>
using namespace std;
struct st
{
int a, b;
}p[100000]; // 定义一个结构体数组存储各个桃子的信息
bool cmp(st A, st B) // 自定义cmp函数,进行二级排序
{
if (A.b == B.b) return A.a > B.a;
return A.b > B.b;
}
int n, sum = 1, i, ans;
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ )
cin >> p[i].a >> p[i].b;
sort(p + 1, p + 1 + n, cmp); // 调用sort
while (sum != 0 || i == n) // 模拟吃桃子的过程计算最大开心程度
{
i ++ ;
ans += p[i].a;
sum -- ;
sum += p[i].b;
}
cout << ans << endl;
return 0;
}
2 comments
-
ZKXWTF LV 8 @ 2024-12-28 15:08:45
吃桃子那道题说实话不用排序相同开胃值中开心值最高,可以直接把所有开胃的桃子吃完,毕竟开胃值不可能小于1(((
🤔 2 -
2024-12-28 15:06:18@
刚在群里面说不至于用贪心吧就被打脸了哭😥
🤣 2
- 1