Educational Codeforces Round 34 (Rated for Div. 2)

这是我这个弱渣第一次正儿八经打codeforce的比赛

  • 只水出来A题一道签到题,B题和C题只是有思路 但是并没有写出来 至于D E F就根本没有看 可能没有挑战的欲望吧 以后就算做不出来也会想一想思路的
  • 总结一下 还是算法理解的不透彻 做题做的不够多 思路不够开阔
  • 而且自己就掌握那一点算法 总是想着用 画蛇添足
  • 看别人的代码是真的感受到了算法的魅力 简洁 大方
  • 赶紧抓紧复习完 然后就可以愉快的写一个寒假的代码啦

接下来开始看一看题目

A

  • 问题简述:本质上就是拿糖问题 一次拿3个或者7个 给定糖果的数量 求是否能拿糖成功

自己的写法dfs

#include
using namespace std;
void dfs(int ans,int a);
int step[] = { 3,7 };
bool flag;
int main()
{
    int T;
    int a;
    cin >> T;
    while(T--)
    {
        cin >> a;
        flag = false;
        dfs(0, a);
         if (flag == true)
             cout << "YES" << endl;
         else
             cout << "NO" <void dfs(int ans, int a)
{
    int i;
    int dans;
    for (i = 0; i < 2; i++)
    {
        dans = step[i]+ans;
        if (dans < a)
            dfs(dans, a);
        if(dans==a)
        {
            flag = true;
            return;
        }
        if (dans > a)
            return;
    }
}

大神的写法

int main() {
    int n, a;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> a;
        bool flag = 0;
        for (int j = 0; j < a && j * 3 <= a; ++j) {
            for (int z = 0; z < a && j * 3 + z * 7 <= a; ++z) {
                if (j * 3 + z * 7 == a) {
                    cout << "YES\n";
                    flag = 1;
                    break;
                }
            }
            if (flag) break;
        }
        if (!flag) cout << "NO\n";
    }
}
  • 由于数据量并不是很大 所以说直接暴力搜索就好了 这种每次拿几个的题目如果情况不是很多的话暴力求解还ok

B

  • 问题简述:打怪升级 并输出过程
  • 自己的想法:第一开始想到的是bfs 然后后面不会写。。。输出的过程 就这样这道题没什么思路

大神的写法

我觉得是最朴实 最简单 最有效的方法吧

#include 
using namespace std;

int main() {
    int h1, a1, c1, h2, a2, cnt = 0;
    cin >> h1 >> a1 >> c1 >> h2 >> a2;
    vector<string> ans;
    while (h2 > 0) {
        if (a2 < h1 || h2 - a1 <= 0) {
            ans.push_back("STRIKE");
            h2 -= a1;
            h1 -= a2;
        }
        else {
            ans.push_back("HEAL");
            h1 += c1;
            h1 -= a2;
        }
    }
    cout << ans.size() << '\n';
    for (int i = 0; i < ans.size(); ++i)
        cout << ans[i] << '\n';
}
  • 这题没做出来不应该的

C

  • 问题简述:放盒子问题 要求盒子按大小排放 然后里面有盒子的不能继续放盒子
  • 自己的想法:一开始想到是贪心法 就类似于剪木板 求开销最小的那题 也就是说 两个数最小的一定是树的相同级数之后再分上一层之类的

大神的写法

#include 
using namespace std;

int main() {
    int n, a;
    cin >> n;

    map<int, int> c;

    for (int i = 0; i < n; ++i) {
        cin >> a;
        c[a]++;
    }
    int sol = 0;
    for (auto p : c) {
        sol = max(sol, p.second);
    }

    cout << sol << '\n';

}

emmmm我没看懂。。。
就这样吧 等有时间来填这次比赛的坑,或者等我变强一点再来填坑(不存在的

你可能感兴趣的:(codeforces)