【汇总】贴一下TopCoder SRM 303 DIV I 500分题的题目和...

来源:互联网 发布:时空幻境知乎 编辑:程序博客网 时间:2024/05/16 15:47

武汉白云黄鹤站∶精华区
发信人: Fastest (Fastest), 信区: Algorithm
标  题: 【汇总】贴一下TopCoder SRM 303 DIV I 500分题的题目和...
发信站: 武汉白云黄鹤站 (2006年06月05日13:30:43 星期一), 站内信件
 
发信人:  Ouer (偶尔)
发信站:  武汉白云黄鹤站 (2006年05月19日03:11:05 星期五)
 
题目的意思很简单,就是在一个棋盘上面放置了一些Knights,为了让它们之间不互相攻击
要拿掉一些Knights,要求最少要拿掉多少个Knights
 
这是一道二分图的匹配问题(黑书的第332页有介绍),但是好像有人用贪心给过了
 
代码如下:
 
#include <vector>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;
class Knights
{
    bool path[800][800];
    int match[800];
    int p[800][2];
    bool visit[800];
    int cnt, res;
    public:
    int DFS(int p)
    {
        int i, t;
        for (i = 0; i < cnt; i++)
        {
            if (path[i][p] && !visit[i])
            {
                visit[i] = 1;
                t = match[i];
                match[i] = p;
                if (t == -1 || DFS(t))
                {
                    return 1;
                }
                match[i] = t;
            }
        }
        return 0;   
    }
    
    int makeFriendly(int N, vector <string> pos)
    {
        int i, j, dx, dy, add, minu;
        cnt = 0;
        i = N;
        for (i = 0; i < pos.size(); i++)
        {
            for (j = 0; j < pos[i].length();)
            {
                p[cnt][0] = pos[i][j] - 'A';
                p[cnt][1] = pos[i][j + 1] - '0';
                if ((j + 2) < pos[i].length() && pos[i][j + 2] != ' ')
                {
                    p[cnt][1] = p[cnt][1] * 10 + pos[i][j + 2] - '0';
                    j++;
                }
                j += 3;
                cnt++;
            }
        }
        memset(path, 0, sizeof(path));
        for (i = 0; i < cnt; i++)
        {
            for (j = i + 1; j < cnt; j++)
            {
                dx = p[i][0] - p[j][0];
                dy = p[i][1] - p[j][1];
                dx = abs(dx);
                dy = abs(dy);
                add = dx + dy;
                minu = abs(dx - dy);
                if (add == 3 && minu == 1)
                {
                    path[i][j] = path[j][i] = 1;
                }
            }
        }
        memset(match, -1, sizeof(match));
        for (i = 0, res = 0; i < cnt; i++)
        {
            memset(visit, 0, sizeof(visit));
            res += DFS(i);
        }
        return res / 2;
    }
};
 
 
──────────────────────────────────────
发信人:  Ouer (偶尔)
发信站:  武汉白云黄鹤站 (2006年05月19日03:12:41 星期五)
 
比赛的时候没有通过,比赛结束之后又写出来的
 
通过了系统测试
 
【 在 Ouer (偶尔) 的大作中提到: 】
∶ 题目的意思很简单,就是在一个棋盘上面放置了一些Knights,为了让它们之间不互相攻击
∶ 要拿掉一些Knights,要求最少要拿掉多少个Knights
∶ 这是一道二分图的匹配问题(黑书的第332页有介绍),但是好像有人用贪心给过了
∶ 代码如下:
∶ #include <vector>
∶ #include <string>
∶ #include <cstring>
∶ #include <cmath>
∶ using namespace std;
∶ class Knights
∶ .................(以下省略)
 
 
──────────────────────────────────────
发信人:  rpmes (Sempr加油!)
发信站:  武汉白云黄鹤站 (2006年05月19日03:45:09 星期五)
 
hoho
 
【 在 Ouer (偶尔) 的大作中提到: 】
∶ 题目的意思很简单,就是在一个棋盘上面放置了一些Knights,为了让它们之间不互相攻击
∶ 要拿掉一些Knights,要求最少要拿掉多少个Knights
∶ 这是一道二分图的匹配问题(黑书的第332页有介绍),但是好像有人用贪心给过了
∶ 代码如下:
∶ #include <vector>
∶ #include <string>
∶ #include <cstring>
∶ #include <cmath>
∶ using namespace std;
∶ class Knights
∶ .................(以下省略)
 
──────────────────────────────────────
发信人:  Fastest (Fastest)
发信站:  武汉白云黄鹤站 (2006年05月19日09:40:03 星期五)
 
受不了你了...
 
【 在 rpmes (Sempr加油!) 的大作中提到: 】
∶ hoho
∶ 【 在 Ouer (偶尔) 的大作中提到: 】
∶ : 题目的意思很简单,就是在一个棋盘上面放置了一些Knights,为了让它们之间不互相攻击
∶ : 要拿掉一些Knights,要求最少要拿掉多少个Knights
∶ : 这是一道二分图的匹配问题(黑书的第332页有介绍),但是好像有人用贪心给过了
∶ : 代码如下:
∶ : #include <vector>
∶ : #include <string>
∶ : #include <cstring>
∶ : #include <cmath>
∶ .................(以下省略)
 
 
──────────────────────────────────────
发信人:  Fastest (Fastest)
发信站:  武汉白云黄鹤站 (2006年05月19日09:40:51 星期五)
 
max_match.....
最优匹配呢?
 
【 在 Ouer (偶尔) 的大作中提到: 】
∶ 题目的意思很简单,就是在一个棋盘上面放置了一些Knights,为了让它们之间不互相攻击
∶ 要拿掉一些Knights,要求最少要拿掉多少个Knights
∶ 这是一道二分图的匹配问题(黑书的第332页有介绍),但是好像有人用贪心给过了
∶ 代码如下:
∶ #include <vector>
∶ #include <string>
∶ #include <cstring>
∶ #include <cmath>
∶ using namespace std;
∶ class Knights
∶ .................(以下省略)
 
 
──────────────────────────────────────
发信人:  Ouer (偶尔)
发信站:  武汉白云黄鹤站 (2006年05月19日09:59:25 星期五)
 
不过感觉中TopCoder的代码应该都在1K以下的...
 
【 在 Ouer (偶尔) 的大作中提到: 】
∶ 题目的意思很简单,就是在一个棋盘上面放置了一些Knights,为了让它们之间不互相攻击
∶ 要拿掉一些Knights,要求最少要拿掉多少个Knights
∶ 这是一道二分图的匹配问题(黑书的第332页有介绍),但是好像有人用贪心给过了
∶ 代码如下:
∶ #include <vector>
∶ #include <string>
∶ #include <cstring>
∶ #include <cmath>
∶ using namespace std;
∶ class Knights
∶ .................(以下省略)
 
 
──────────────────────────────────────
发信人:  Fastest (Fastest)
发信站:  武汉白云黄鹤站 (2006年05月19日10:01:35 星期五)
 
这个有模板,建图了就比较快了.
 
【 在 Ouer (偶尔) 的大作中提到: 】
∶ 不过感觉中TopCoder的代码应该都在1K以下的...
∶ 【 在 Ouer (偶尔) 的大作中提到: 】
∶ : 题目的意思很简单,就是在一个棋盘上面放置了一些Knights,为了让它们之间不互相攻击
∶ : 要拿掉一些Knights,要求最少要拿掉多少个Knights
∶ : 这是一道二分图的匹配问题(黑书的第332页有介绍),但是好像有人用贪心给过了
∶ : 代码如下:
∶ : #include <vector>
∶ : #include <string>
∶ : #include <cstring>
∶ : #include <cmath>
∶ .................(以下省略)
 
 
──────────────────────────────────────
发信人:  Ouer (偶尔)
发信站:  武汉白云黄鹤站 (2006年05月19日10:05:17 星期五)
 

 
我是自己敲出来的......
 
yzf建图的时候建错了,没有处理 A10这种情况,把所有的位置都当成两个字符了,结果程
序被干掉了
 
我是比赛结束后才过的
 
【 在 Fastest (Fastest) 的大作中提到: 】
∶ 这个有模板,建图了就比较快了.
∶ 【 在 Ouer (偶尔) 的大作中提到: 】
∶ : 不过感觉中TopCoder的代码应该都在1K以下的...
∶ : .................(以下省略)
 
 
──────────────────────────────────────
发信人:  Fastest (Fastest)
发信站:  武汉白云黄鹤站 (2006年05月19日10:12:17 星期五)
 
等暑假我也半夜跟你们玩.....
这个有趣...哈哈
 
【 在 Ouer (偶尔) 的大作中提到: 】
∶ 嗯
∶ 我是自己敲出来的......
∶ yzf建图的时候建错了,没有处理 A10这种情况,把所有的位置都当成两个字符了,结果程
∶ 序被干掉了
∶ 我是比赛结束后才过的
∶ 【 在 Fastest (Fastest) 的大作中提到: 】
∶ : 这个有模板,建图了就比较快了.
 
 
──────────────────────────────────────

华中地区网络中心 

原创粉丝点击