Educational Codeforces Round 121 A~C

A. Equidistant Letters

题意:
给一个字符串 ,最多出现两个相同的字母。 保证出现相同字母的相隔距离是一样的。
思路:
出现相同字母连续输出即可。
我的代码:

inline void solve()
{
  string s;
  cin >> s;
  map<char, int> m;
  int len = s.length();
  for (int i = 0; i < len; i++)
  {
    m[s[i]]++;
  }
  for (auto i = m.begin(); i != m.end(); i++)
  {
    if (i->second > 1)
      cout << i->first << i->first;
    else
      cout << i->first;
  }
  cout << endl;
}

大佬代码:

void solve(){
    scanf("%s",a+1),n=strlen(a+1);
    sort(a+1,a+n+1);
    rep(i,1,n)putchar(a[i]);    
    puts("");
}

总结:忘记直接排序就可以起到一样效果了,属实是舍近求远了。

B. Minor Reduction

题意:给你一个数字。你必须对它执行一次以下简化:取两个相邻的数字x并用不带前导零的总和替换它们(如果总和是0,则表示为单个0).
思路:两个数字合成一个 ,除非加起来超过10才能比以前更大。否则会更小。因此需要对上述两种情况进行分类讨论和操作即可。

inline void solve()
{
  string s;
  cin >> s;
  bool flag = 0;
  for (int i = s.size() - 2; ~i; i--)
  {
    if (s[i] - '0' + s[i + 1] - '0' >= 10)
    {
      int x = s[i] - '0' + s[i + 1] - '0';
      s[i] = x / 10 + '0', s[i + 1] = x % 10 + '0';
      cout << s << '\n';
      flag = 1;
      break;
    }
  }
  if (!flag)
  {
    int x = s[0] - '0' + s[1] - '0';
    s.erase(s.begin());
    s[0] = x + '0';
    cout << s << '\n';
  }
}

C. Monsters And Spells

在这里插入图片描述
思路:模拟题,正解应该是暴搜,但我尝试用dp来做。但是下一道D题2100分而且还是暴搜我就不补了。
我的DP:

inline void solve()
{
  int n;
  cin >> n;
  vector<int> v(n);
  vector<int> w(n);
  for (int i = 0; i < n; i++)
  {
    cin >> v[i];
  }
  for (int i = 0; i < n; i++)
  {
    cin >> w[i];
  }
  for (int i = n - 2; i >= 0; i--)
  {
    w[i] = max(w[i], w[i + 1] - v[i + 1] + v[i]);
  }
  for (int i = 1; i < n; i++)
  {
    if (v[i] - v[i - 1] < w[i])
    {
      w[i] = max(w[i], w[i - 1] + v[i] - v[i - 1]);
    }
  }
  long long ans = 1LL * w[0] * (w[0] + 1) / 2;
  for (int i = 1; i < n; i++)
  {
    if (v[i] - v[i - 1] + w[i - 1] == w[i])
    {
      ans += 1LL * (w[i]) * (w[i] + 1) / 2;
      ans -= 1LL * (w[i - 1]) * (w[i - 1] + 1) / 2;
    }
    else
    {
      ans += 1LL * (w[i]) * (w[i] + 1) / 2;
    }
  }
  cout << ans << endl;
}

大佬的dp:

	scanf("%d", &n), ans = 0;
    for (int i = 1; i <= n; i++)
      scanf("%d", &a[i]);
    for (int i = 1; i <= n; i++)
      scanf("%d", &b[i]);
    for (int i = n - 1; i >= 1; i--)
      b[i] = max(b[i], b[i + 1] - (a[i + 1] - a[i]));
    int lst = 0;
    for (int i = 1; i <= n; i++)
    {
      if (a[i] - a[i - 1] >= b[i])
        ans += 1ll * (1 + b[i]) * b[i] / 2, lst = b[i];
      else
        ans += 1ll * (lst + 1 + (lst + a[i] - a[i - 1])) * (a[i] - a[i - 1]) / 2ll, lst += a[i] - a[i - 1];
    }
    printf("%lld\n", ans);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值