语法周赛 weekend4 题解

算利润

难度:简单数学问题。

钱包金额 n 元,今天的价格 x 元,明天价格 y 元。

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

如果明天价格 y 元高于今天价格 x 元,首先计算一件物品的盈利金额 y−x 元,可以购买 n/x(计算机整数除整数自动取整)件,所以一共可以盈利 n/x(y−x) 元,总钱数 n+n/x(y−x)。

#include <bits/stdc++.h>
using namespace std;
int n,x,y;
int main(){
  cin>>n>>x>>y;
  if(x<y){
    cout<<n/x*y+n-n/x*x;  
  }else{
    cout<<n;
  }
  return 0;
}

星星历

难度:日期进制的数学计算问题,只需要计算日期输出 1 1 n 也有 30 分。

首先理解星星历的机制,星星历采用每星 120 天,每年 3 星,从 1 年 1 星 1 日开始计算。

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

计算方法有两种:

  • 方法一,可以使用暴力方案一天一天去数,本题数据可做 100 分。
  • 方法二,
    • 计算年可以通过 (n−1)/360+1 的方案,主要给天数减一,规避掉整除商会加 1 的情况,然后从 1 年开始计算,加到 1 上即可。
    • 计算星可以通过计算得到当前的天数 d=(n−1)%360+1(也是要规避整除情况),然后再由 (d−1)/120+1 计算出星。
    • 计算日同上,规避整除即可。
#include <iostream>
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;
  return 0;
}

简单系动词

难度:主要考察输入问题,如果使用文件结束符结束输入。

输入完成后,从左到右扫描单词,只要不是系动词就输出,如果是系动词,根据当前系动词前面的单词情况,更改现在的系统词输出即可,因为题目保证语句通顺,所以可以保证系统词只是位置不对,数量和匹配一定是对的,也不需要统计系动词数量。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    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;
}

唱跳RAP

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

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

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

#include <iostream>
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]]--;
  }  
  long long sum=0;
  for(int i=1;i<=100;i++){
    if(T[i]>=2){
      sum+=(T[i]-1+1)*(T[i]-1)/2;
    }
  }
  cout<<sum;
}

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注