Educational Codeforces Round 122 A~D

A. Div. 7

题意:
一个整数n.您必须更改其中的最小位数,使其能被 7 7 7整除。
思路:改变最后一位,把最后一位枚举一遍。

inline void solve()
{
    
    
  int n;
  cin >> n;
  if (n % 7 == 0)
  {
    
    
    cout << n << endl;
  }
  else
  {
    
    
    int temp = n % 10;
    for (int i = 0; i <= 9; i++)
    {
    
    
      int tt = n;
      tt = tt / 10 * 10 + i;
      if (tt % 7 == 0)
      {
    
    
        cout << tt << endl;
        return;
      }
    }
  }
}

jiangly思路:n先减去n % 10,然后+9再减去自己取余x的余数 该数便能被x整除(x可为0意外的任意数字),不明白怎么推算出来的 但是还是要记住这个小规律。

void solve()
{
    
    
  int n;
  cin >> n;

  if (n % 7 == 0)
  {
    
    
    cout << n << "\n";
  }
  else
  {
    
    
    n -= n % 10;
    n += 9;
    n -= n % 7;
    cout << n << "\n";
  }
}

B. Minority

题意:
你会得到一个字符串s,仅由字符“0”和“1”组成。

您必须选择一个连续的子字符串s并从子字符串中删除该字符的所有出现,这是其中的严格少数。

也就是说,如果子字符串中 ‘0’ 的数量严格小于 ‘1’ 的数量,则从子字符串中删除所有出现的 ‘0’。如果“1”的数量严格小于“0”的数量,请删除所有出现的“1”。如果金额相同,则不执行任何操作。

您必须只应用一次该操作。可以删除的最大字符数是多少?

思路:遍历记数对比一下就可以了

inline void solve()
{
    
    
  string s;
  cin >> s;
  int len = s.length();
  int sum_0 = 0, sum_1 = 0;
  for (int i = 0; i < len; i++)
  {
    
    
    if (s[i] == '0')
      sum_0++;
    else
      sum_1++;
  }
  if (sum_0 > sum_1)
    cout << sum_1 << endl;
  else if (sum_1 > sum_0)
    cout << sum_0 << endl;
  else
    cout << sum_0 - 1 << endl;
}

C. Kill the Monster

题意:一个角色和一个怪物之间的战斗过程如下。假设角色最初有健康状况hC和攻击dC;怪物最初有健康状况hM和攻击dM。在战斗前,Monocarp可以花费最多k个金币来升级他的角色的武器和/或盔甲;每次升级都要花费正好一个金币,每次武器升级都会使角色的攻击力增加w,每次盔甲升级都会使角色的健康状况增加a。
思路:贪心+模拟 ACM招新题可以出一出。

inline void solve()
{
    
    
  cin >> hc >> dc >> hm >> dm >> k >> w >> a;
  for (int i = 0; i <= k; i++)
  {
    
    
    int h = hc + a * i;
    int d = dc + w * (k - i);
    int cm = (hm + d - 1) / d;
    int mc = (h + dm - 1) / dm;
    if (cm <= mc)
    {
    
    
      cout << "YES" << endl;
      return;
    }
  }
  cout << "NO" << endl;
}

D. Make Them Equal

题意:
有一个初始值全为1的 a a a数组,你可以进行以下操作。选择序列中的 A i A_i Ai 和 一个数 x x x
A i = A i + a i / x A_i =A_i+a_i/x Ai=Ai+ai/x
若多次操作后 A i = B I A_i=B_I Ai=BI,可以获得价值 C i C_i Ci
问经过K次操作后获得的最大价值是多少。

思路:
首先我们发现1变到x最多操作12次,其次这是个01背包。

const int N = 1005;
int dp[N];
inline void solve()
{
    
    
  int n, k;
  cin >> n >> k;
  vector<int> b(n), c(n);
  for (int i = 0; i < n; i++)
    cin >> b[i];
  for (int i = 0; i < n; i++)
    cin >> c[i];
  k = min(k, 12 * n);
  vector<int> f(k + 1);
  for (int i = 0; i < n; i++)
  {
    
    
    for (int j = k; j >= dp[b[i]]; j--)
    {
    
    
      f[j] = max(f[j], f[j - dp[b[i]]] + c[i]);
    }
  }
  cout << f[k] << endl;
}

猜你喜欢

转载自blog.csdn.net/qq_45148277/article/details/126314286