T1 算利润

难度:简单数学问题。

算法:模拟。

钱包金额 nn 元,今天的价格 xx 元,明天价格 yy 元。

首先判断价格是否存在涨幅,如果明天价格 yy 元小于等于今天价格 xx 元,买了不会赚,所以不做买卖,金钱没有变动,输出 nn

如果明天价格 yy 元高于今天价格 xx 元,首先计算一件物品的盈利金额 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 也有 3030 分。

算法:枚举,模拟。

首先理解星星历的机制,星星历采用每星 120120 天,每年 33 星,从 111111 日开始计算。

还需要了解日期进制和普通进制的差异,例如:11120120 日下一天是 2211 日,1133120120 日下一天是 221111 日。日期进制没有 00,每次满日或者满星是不进位的,直到下一天,才会进位,并且当前直接为 11 开始,所以计算年星日的时候一定要注意这个满星,满日问题。

计算方法有两种:

方法一,可以使用暴力枚举一天一天去数,本题数据可做 100100 分。

方法二,计算年可以通过 (n - 1) / 360 + 1 的方案,为了规避掉整除商会加1的情况,给天数减一,然后从 11 年开始计算,结果再加 11 即可。

计算星可以通过计算得到当前的天数 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

难度:主要考察桶的应用。

算法:模拟。

利用桶统计每个数字出现的次数,然后根据每个数字出现的次数,计算选择方案即可。

对于数字 ii 出现次数为 T[i] 次,根据排列组合公式从 T[i] 个中取两个的数量次数为 T[i]1+T[i]2+T[i]3+......+1T[i]-1+T[i]-2+T[i]-3+......+1。利用高斯求和公式得出计算公式为 (T[i]1)(T[i]1+1)2\frac{(T[i]-1)*(T[i]-1+1)}{2} 为数字 ii 选取 22 个的次数,所有数字的次数和即为答案。

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;
}

0 comments

No comments so far...