ACM-ICPC(11/9)

Posted 树的种子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM-ICPC(11/9)相关的知识,希望对你有一定的参考价值。

今天看了一下黑书,感觉很刘汝佳,是他的风格,题目挺好的~~~

 

  • 枚举

P12翻硬币

二进制枚举每一列的情况2^9种。

在每一种情况下然后对于每一行就是翻与不翻的两种情况~~~

 

  • 贪心

P13钓鱼问题

POJ上有,之前做过,可以再优化一下。

首先枚举在哪里结束,然后剩下的时间就是用来钓鱼,每次选取当前最大的钓鱼,然后更新当前值(优先队列插入与弹出)

 

  • 递归

P20三色三角形

当查找失败的时候还是要回溯一下,看了一下网上的代码,发现好像我的是最短的~~~

技术分享
#include <bits/stdc++.h>

using namespace std;

char str[1005];
vector<char> v;

map<int,int> mp;
int n;
bool flag[1005];
struct Ans {
    int a,b;
}ans[1005];

struct Node {
    char s;
    int pos;
};

int cnt;
bool solve(vector<Node> &v) {
    int len = v.size();
    if(len==3) {
        if(v[0].s!=v[1].s&&v[0].s!=v[2].s&&v[1].s!=v[2].s) {
            return true;
        }
        return false;
    }
    for(int i = 0; i < len; i++) {
        Node tmp  = v[(i+1)%len];
        if(v[i].s!=v[(i+1)%len].s&&v[i].s!=v[(i+2)%len].s&&v[(i+1)%len].s!=v[(i+2)%len].s) {
            ans[cnt].a = v[i].pos;
            ans[cnt++].b = v[(i + 2)%n].pos;
            auto it = v.begin() + (i+1)%n;
            v.erase(it);
            if(solve(v)==true)
                return true;
            cnt--;
            v.insert(it,tmp);
        }
    }
    return false;
}

vector<Node> strs;
int main()
{
    scanf("%d%s",&n,str);

    for(int i = 0; i < n; i++)
        strs.push_back((Node){str[i],i});

    if(!solve(strs)) {
        puts("0");
    }
    else {
        printf("%d\n",cnt);
        for(int i = 0; i < cnt; i++)
            printf("%d %d\n",ans[i].a+1,ans[i].b+1);

    }
    return 0;
}
View Code

 

以上是关于ACM-ICPC(11/9)的主要内容,如果未能解决你的问题,请参考以下文章

第五届新疆省ACM-ICPC程序设计竞赛(Java版)

2018 ACM-ICPC, Syrian Collegiate Programming Contest

Getting started with Processing 示例11-9 追随鼠标移动

2017 ACM-ICPC Beijing, D - Chinese Checkers

G. The Galactic Olympics(2016-2017 ACM-ICPC, Egyptian Collegiate Programming Contest (ECPC 16)题解)(代码

2014-2015 ACM-ICPC, NEERC, Eastern Subregional Contest Problem H. Pair: normal and paranormal(示例代码