【HT-020-Div.4】核桃新手组周赛答案

以下为核桃编程官方提供的代码,供参考

<center>
<h2>第一题</h2>
</center>

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n; // 跑了多少米
int x; // 跑了多少完整的圈
int m; // 不完整的圈的长度
signed main()
{
  scanf("%lld", &n);
  x = n / 400;
  m = n % 400;
  printf("%lld\n", x);
  if (m % 100 == 0) // 整百数或0,说明在直道与弯道的交界处,不输出
  {
    return 0;
  }
  if ((0 < m && m < 100) || (200 < m && m < 300)) // 在弯道
  {
    puts("S");
  }
  else // 不在交界处、不在弯道、必定在直道
  {
    puts("L");
  }
  return 0;
}

<center>
<h2>第二题</h2>
</center>

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n; // 脆弱木板数量
int ans = LLONG_MAX; // long long 的最大值
int id, times; // 同上文
signed main()
  {
  scanf("%lld", &n);
  for (int i = 1; i <= n; ++i)
  {
    scanf("%lld %lld", &id, &times);
    ans = min(ans, id + (times - 1) / 2);
  }
  printf("%lld\n", ans);
  return 0;
  }

<center>
<h2>第三题</h2>
</center>

#include <bits/stdc++.h>
using namespace std;
const int N = 30;
const int M = 1e5 + 5;
struct word
{
  string s;
} d[M]; // 存储词典中的单词
bool v[N]; // 标记坏掉的键位
int n; // 坏掉的键位的数量
int m; // 文章中单词的数量
int cnt; // 词典中单词的数量
int slen; // 单词的长度
char c; // 读入坏掉的键位
string s; // 读入文章中的单词
void add() // 尝试将s加入词典中
{
  bool f = 0; // 标记s是否存在于词典中
  for (int i = 1; i <= cnt; ++i)
  {
    if (d[i].s == s)
    {
    f = 1;
    break;
    }
  }
  if (!f)
    d[++cnt].s = s; // s当前不存在于词典中,则加入s
  return;
}
int main()
{
  cin >> n; // 读入坏掉的按键
  for (int i = 1; i <= n; ++i)
  {
    cin >> c;
    v[c - 'a'] = 1;
  }
  cin >> m; // 读入文章中的单词,在读入过程中处理答案
  for (int i = 1; i <= m; ++i)
  {
    cin >> s;
    slen = s.size();
    for (int j = 0; j < slen; ++j)
    {
      if (v[s[j] - 'a'])
      {
        add();
        break; // 单词中的任意一个字母不能打出,该单词则不能打出,直接跳出循环即可
      }
    }
  }
  printf("%d\n", cnt);
  return 0;
}

<center>
<h2>第四题</h2>
</center>

#include <bits/stdc++.h>
using namespace std;
struct pai
{
  // cnt:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  // pai: 0 0 3 4 5 6 7 8 9 10 J Q K A 2
  int cnt[20];
  int num; // 牌的总数
  bool check(int ne) // 检查是否有能出的牌
  {
    for (int i = 3; i <= 15; ++i)
      if (i > ne && cnt[i])
        return 1;
    return 0;
  }
  void chu(int id, int &ne) // 出牌
  {
    for (int i = 3; i <= 15; ++i)
    {
      if (i > ne && cnt[i]) // 出的牌必须比前一张大
      {
        ne = i;
// 加上取地址符'&'后,在函数中修改一个数值,主函数中的值也会改变
        --cnt[i];
        --num;
        printf("%d use: %d\n", id, i > 13 ? i - 13 : i);
// 三目运算符保证A 2 正常输出
        return;
      }
    }
    return;
  }
} p[4]; // 3个人
signed main()
{
  for (int i = 1; i <= 3; ++i)
  {
    int x;
    scanf("%d", &x);
    for (; x;)
    {
      if (x < 3)
      x += 13; // 将 A 、2 加13,方便处理
      ++p[i].num;
      ++p[i].cnt[x];
      scanf("%d", &x);
    }
  }
  int now = 1; // 现在谁出牌
  int ne = 0; // 上一张牌的大小0为轮空
  int n_id = 1; // 上一个出牌的人
  while (p[1].num && p[2].num && p[3].num) // 有人牌数为0,结束
  {
    if (!ne)
    {
// 一次出牌,需要更新:上一位出牌人、上一张牌的大小、下一位出牌人
      p[now].chu(now, ne);
      n_id = now;
      now %= 3;
      ++now;
    }
    else
    {
      while (!p[now].check(ne)) // 看看谁要得起
      {
        now %= 3;
        ++now;
        if (now == n_id)
          break; // 剩余2人都要不起
      }
      if (now != n_id) // 没轮空
      { // 出牌的同时不要忘记更新
        p[now].chu(now, ne);
        n_id = now;
        now %= 3;
        ++now;
      }
      else
        ne = 0; // 轮空了
    }
  } // 结束后,谁的牌为0,谁获胜
  if (!p[1].num)
    puts("winer: 1");
  else if (!p[2].num)
    puts("winer: 2");
  else
    puts("winer: 3");
  return 0;
}
```以下为核桃编程官方提供的代码,供参考

<center>
<h2>第一题</h2>
</center>

```cpp
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n; // 跑了多少米
int x; // 跑了多少完整的圈
int m; // 不完整的圈的长度
signed main()
{
  scanf("%lld", &n);
  x = n / 400;
  m = n % 400;
  printf("%lld\n", x);
  if (m % 100 == 0) // 整百数或0,说明在直道与弯道的交界处,不输出
  {
    return 0;
  }
  if ((0 < m && m < 100) || (200 < m && m < 300)) // 在弯道
  {
    puts("S");
  }
  else // 不在交界处、不在弯道、必定在直道
  {
    puts("L");
  }
  return 0;
}

<center>
<h2>第二题</h2>
</center>

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n; // 脆弱木板数量
int ans = LLONG_MAX; // long long 的最大值
int id, times; // 同上文
signed main()
  {
  scanf("%lld", &n);
  for (int i = 1; i <= n; ++i)
  {
    scanf("%lld %lld", &id, &times);
    ans = min(ans, id + (times - 1) / 2);
  }
  printf("%lld\n", ans);
  return 0;
  }

<center>
<h2>第三题</h2>
</center>

#include <bits/stdc++.h>
using namespace std;
const int N = 30;
const int M = 1e5 + 5;
struct word
{
  string s;
} d[M]; // 存储词典中的单词
bool v[N]; // 标记坏掉的键位
int n; // 坏掉的键位的数量
int m; // 文章中单词的数量
int cnt; // 词典中单词的数量
int slen; // 单词的长度
char c; // 读入坏掉的键位
string s; // 读入文章中的单词
void add() // 尝试将s加入词典中
{
  bool f = 0; // 标记s是否存在于词典中
  for (int i = 1; i <= cnt; ++i)
  {
    if (d[i].s == s)
    {
    f = 1;
    break;
    }
  }
  if (!f)
    d[++cnt].s = s; // s当前不存在于词典中,则加入s
  return;
}
int main()
{
  cin >> n; // 读入坏掉的按键
  for (int i = 1; i <= n; ++i)
  {
    cin >> c;
    v[c - 'a'] = 1;
  }
  cin >> m; // 读入文章中的单词,在读入过程中处理答案
  for (int i = 1; i <= m; ++i)
  {
    cin >> s;
    slen = s.size();
    for (int j = 0; j < slen; ++j)
    {
      if (v[s[j] - 'a'])
      {
        add();
        break; // 单词中的任意一个字母不能打出,该单词则不能打出,直接跳出循环即可
      }
    }
  }
  printf("%d\n", cnt);
  return 0;
}

<center>
<h2>第四题</h2>
</center>

#include <bits/stdc++.h>
using namespace std;
struct pai
{
  // cnt:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  // pai: 0 0 3 4 5 6 7 8 9 10 J Q K A 2
  int cnt[20];
  int num; // 牌的总数
  bool check(int ne) // 检查是否有能出的牌
  {
    for (int i = 3; i <= 15; ++i)
      if (i > ne && cnt[i])
        return 1;
    return 0;
  }
  void chu(int id, int &ne) // 出牌
  {
    for (int i = 3; i <= 15; ++i)
    {
      if (i > ne && cnt[i]) // 出的牌必须比前一张大
      {
        ne = i;
// 加上取地址符'&'后,在函数中修改一个数值,主函数中的值也会改变
        --cnt[i];
        --num;
        printf("%d use: %d\n", id, i > 13 ? i - 13 : i);
// 三目运算符保证A 2 正常输出
        return;
      }
    }
    return;
  }
} p[4]; // 3个人
signed main()
{
  for (int i = 1; i <= 3; ++i)
  {
    int x;
    scanf("%d", &x);
    for (; x;)
    {
      if (x < 3)
      x += 13; // 将 A 、2 加13,方便处理
      ++p[i].num;
      ++p[i].cnt[x];
      scanf("%d", &x);
    }
  }
  int now = 1; // 现在谁出牌
  int ne = 0; // 上一张牌的大小0为轮空
  int n_id = 1; // 上一个出牌的人
  while (p[1].num && p[2].num && p[3].num) // 有人牌数为0,结束
  {
    if (!ne)
    {
// 一次出牌,需要更新:上一位出牌人、上一张牌的大小、下一位出牌人
      p[now].chu(now, ne);
      n_id = now;
      now %= 3;
      ++now;
    }
    else
    {
      while (!p[now].check(ne)) // 看看谁要得起
      {
        now %= 3;
        ++now;
        if (now == n_id)
          break; // 剩余2人都要不起
      }
      if (now != n_id) // 没轮空
      { // 出牌的同时不要忘记更新
        p[now].chu(now, ne);
        n_id = now;
        now %= 3;
        ++now;
      }
      else
        ne = 0; // 轮空了
    }
  } // 结束后,谁的牌为0,谁获胜
  if (!p[1].num)
    puts("winer: 1");
  else if (!p[2].num)
    puts("winer: 2");
  else
    puts("winer: 3");
  return 0;
}

0 条评论

目前还没有评论...