- 西中经开联校 - 第 4 场周赛
【题解】西中经开联校 - 第 4 场周赛
- 2025-1-2 21:34:28 @
T1 算利润
难度:简单数学问题。
算法:模拟。
钱包金额 元,今天的价格 元,明天价格 元。
首先判断价格是否存在涨幅,如果明天价格 元小于等于今天价格 元,买了不会赚,所以不做买卖,金钱没有变动,输出 。
如果明天价格 元高于今天价格 元,首先计算一件物品的盈利金额 y - x
元,可以购买 n / x
件,所以一共可以盈利 n / x * (y - x)
元,总钱数 n + n / x * (y - x)
。
C++ 代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, x, y;
cin >> n >> x >> y;
if (x < y) n += (y - x) * (n / x);
cout << n << endl;
return 0;
}
T2 星星历
难度:日期进制的数学计算问题,只需要计算日期输出 1 1 n
也有 分。
算法:枚举,模拟。
首先理解星星历的机制,星星历采用每星 天,每年 星,从 年 星 日开始计算。
还需要了解日期进制和普通进制的差异,例如: 星 日下一天是 星 日, 年 星 日下一天是 年 星 日。日期进制没有 ,每次满日或者满星是不进位的,直到下一天,才会进位,并且当前直接为 开始,所以计算年星日的时候一定要注意这个满星,满日问题。
计算方法有两种:
方法一,可以使用暴力枚举一天一天去数,本题数据可做 分。
方法二,计算年可以通过 (n - 1) / 360 + 1
的方案,为了规避掉整除商会加1的情况,给天数减一,然后从 年开始计算,结果再加 即可。
计算星可以通过计算得到当前的天数 d = (n - 1) % 360 + 1
(也是要规避整除情况),然后再由 (d - 1) / 120 + 1
计算出星。
计算日同上,规避整除即可。
C++ 代码 1:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, a, b, c;
cin >> n;
a = b = c = 1;
for (int i = 1; i <= n - 1; i ++ )
{
c ++ ;
if (c > 120)
{
b ++ ;
c = 1;
}
if (b > 3)
{
a ++ ;
b = 1;
}
}
cout << a << " " << b << " " << c << endl;
return 0;
}
C++ 代码 2:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
cout << (n - 1) / 360 + 1 << ' ';
cout << (((n - 1) % 360 + 1) - 1) / 120 + 1 << ' ';
cout << (n - 1) % 120 + 1;
cout << endl;
return 0;
}
T3 简单系动词
难度:主要考察输入问题,如果使用文件结束符结束输入。
算法:字符串处理,模拟。
输入完成后,从左到右扫描单词,只要不是系动词就输出,如果是系动词,根据当前系动词前面的单词情况,更改现在的系统词输出即可,因为题目保证语句通顺,所以可以保证系统词只是位置不对,数量和匹配一定是对的,也不需要统计系动词数量。
C++ 代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string last, now;
last = "";
while (cin >> now)
{
if (now == "am" || now == "are" || now == "is")
{
if (last == "i")
now = "am";
else if (last == "you")
now = "are";
else
now = "is";
}
cout << now << " ";
last = now;
}
return 0;
}
T4 唱跳RAP
难度:主要考察桶的应用。
算法:模拟。
利用桶统计每个数字出现的次数,然后根据每个数字出现的次数,计算选择方案即可。
对于数字 出现次数为 T[i]
次,根据排列组合公式从 T[i]
个中取两个的数量次数为 。利用高斯求和公式得出计算公式为 为数字 选取 个的次数,所有数字的次数和即为答案。
C++ 代码:
#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[1005];
int T[105];
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++ )
{
cin >> a[i];
T[a[i]] ++ ;
}
for (int i = 1; i <= m; i ++ )
{
int t;
cin >> t;
T[a[t]] -- ;
}
int ans = 0;
for (int i = 1; i <= 100; i ++ )
if (T[i] >= 2)
ans += (T[i] - 1) * T[i] / 2;
cout << ans << endl;
return 0;
}