程序员死后的世界简单攻略

之前看到有一个霓虹推出了个页游,叫什么程序员死后的世界,世界观啥的都可以google的到。

寒假没事干就玩了玩,结果其实是个破oj,给日本it公司招人用的。

虽然我不会日语,但是有gg翻译啊,就把地图里面的点都点亮了。

一共分四类题,其中BCD类的题都比较弱智,只要看懂了五分钟差不多就能搞定。

A题比较有意思,是一道NP问题。

题意大概是这样子:有很多建筑物,都是矩形,每个建筑物的长宽和门的位置固定(门一定在建筑物四条边上),现在要把这些建筑物中的一部分放到一个大的矩形地图中,得分为建筑物占地面积总和,要求在门之间互相连通的情况下,面积总和尽量大。

我参考了下届的学弟的思路:大概是按照面积从大到小排序,在边上依次摆放。

而因为地图不是很大,可以通过bfs的方式来判断门是不是联通。

在边上依次摆放的方法就是for16次,分别尝试16种摆放顺序的优先级。

这样是一个确定算法,可以获得23931分。

我后来又加了一个随机化,因为大的矩形即使可以放下,也可以战略性的选择不放,为后面的小的矩形获得空间,所以有一定概率(按照矩形面积的反比例函数)直接不放该矩形,并且多进行几次随机化,得到了更高的分数,24007,暂时排名第五。

  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <ctime>
  4 #include <queue>
  5 #include <utility>
  6 #include <algorithm>
  7
  8 using namespace std;
  9 typedef long long ll;
 10 const int N = 105;
 11 const int dx[] = {0, 1, 0, -1};
 12 const int dy[] = {1, 0, -1, 0};
 13
 14 struct Buildings {
 15     int h, w, r, c, id;
 16     int size;
 17
 18     inline void get(int _id) {
 19         scanf("%d%d%d%d", &h, &w, &r, &c);
 20         id = _id;
 21         size = h * w;
 22     }
 23
 24     inline bool operator < (const Buildings b) const {
 25         return h * w > b.h * b.w;
 26     }
 27 } building[N];
 28
 29 queue <pair<int, int> > q;
 30 int H, W, n, cnt, TOT, a[N][N], vis[N][N], ans[N][N], mx;
 31 int totalSize;
 32
 33 inline bool in(int x, int y) {
 34     return 1 <= x && x <= H && 1 <= y && y <= W;
 35 }
 36
 37 bool check(int x, int y, int h, int w, int id, int r, int c) {
 38     if (a[r][c]) return 0;
 39     for (int i = 0; i < h; ++i)
 40         for (int j = 0; j < w; ++j)
 41             if (a[x + i][y + j]) return 0;
 42     for (int i = 0; i < h; ++i)
 43         for (int j = 0; j < w; ++j)
 44             a[x + i][y + j] = id;
 45
 46     while (!q.empty()) q.pop();
 47     q.push(make_pair(r, c));
 48     vis[r][c] = ++TOT;
 49     int tmp = 0;
 50     int nowX, nowY, X, Y;
 51     while (!q.empty()) {
 52         if (tmp == cnt) {
 53             a[r][c] = -1;
 54             return ++cnt;
 55         }
 56         nowX = q.front().first, nowY = q.front().second;
 57         q.pop();
 58         for (int i = 0; i < 4; ++i) {
 59             X = nowX + dx[i], Y = nowY + dy[i];
 60             if (in(X, Y) && a[X][Y] <= 0 && vis[X][Y] != TOT) {
 61                 vis[X][Y] = TOT;
 62                 if (a[X][Y] == -1) ++tmp;
 63                 q.push(make_pair(X, Y));
 64             }
 65         }
 66     }
 67     for (int i = 0; i < h; ++i)
 68         for (int j = 0; j < w; ++j)
 69             a[x + i][y + j] = 0;
 70     return 0;
 71 }
 72
 73 void update() {
 74     int tmp = 0;
 75     for (int i = 1; i <= H; ++i)
 76         for (int j = 1; j <= W; ++j)
 77             tmp += (a[i][j] > 0);
 78     if (tmp <= mx) return;
 79     mx = tmp;
 80     for (int i = 1; i <= H; ++i)
 81         for (int j = 1; j <= W; ++j)
 82             ans[i][j] = a[i][j];
 83 }
 84
 85 inline bool random_(int sz) {
 86     //return 1ll * rand() * rand() % totalSize > building[1].size - sz / 2;
 87     return rand() % sz > sz - 3;
 88 }
 89
 90 int main() {
 91     int h, w, r, c, id;
 92     srand(time(0));
 93     scanf("%d%d%d", &H, &W, &n);
 94     for (int i = 1; i <= n; ++i) {
 95         building[i].get(i);
 96         totalSize += building[i].size;
 97     }
 98     sort(building + 1, building + n + 1);
 99     for (int set = 0; set < 256; set++) {
100         cnt = 0;
101         for (int i = 1; i <= H; ++i)
102             for (int j = 1; j <= W; ++j)
103                 a[i][j] = 0;
104         for (int i = 1; i <= n; ++i) {
105             if (random_(building[i].size)) {
106                 //printf("%d Done %d\n", i, set);
107                 continue;
108             }
109             h = building[i].h;
110             w = building[i].w;
111             r = building[i].r;
112             c = building[i].c;
113             id = building[i].id;
114             if (r == 1) {
115                 for (int x = H - h + 1; x > 1; --x) {
116                     if (set & 1) {
117                         for (int y = 1; y <= W - w + 1; y++)
118                             if (check(x, y, h, w, id, x - 1, y + c - 1))
119                                 goto end;
120                     } else {
121                         for (int y = W - w + 1; y >= 1; y--)
122                             if (check(x, y, h, w, id, x - 1, y + c - 1))
123                                 goto end;
124                     }
125                 }
126             } else
127             if (r == h) {
128                 for (int x = 1; x <= H - h; ++x) {
129                     if (set & 2) {
130                         for (int y = 1; y <= W - w + 1; y++)
131                             if (check(x, y, h, w, id, x + r, y + c - 1))
132                                 goto end;
133                     } else {
134                         for (int y = W - w + 1; y >= 1; y--)
135                             if (check(x, y, h, w, id, x + r, y + c - 1))
136                                 goto end;
137                     }
138                 }
139             } else
140             if (c == 1) {
141                 for (int y = W - w + 1; y > 1; y--) {
142                     if (set & 4) {
143                         for (int x = 1; x <= H - h + 1; x++)
144                             if (check(x, y, h, w, id, x + r - 1, y - 1))
145                                 goto end;
146                     } else {
147                         for (int x = H - h + 1; x >= 1; x--)
148                             if (check(x, y, h, w, id, x + r - 1, y - 1))
149                                 goto end;
150                     }
151                 }
152             } else {
153                 for (int y = 1; y <= W - w; y++) {
154                     if (set & 8) {
155                         for (int x = 1; x <= H - h + 1; x++)
156                             if (check(x, y, h, w, id, x + r - 1, y + c))
157                                 goto end;
158                     } else {
159                         for (int x = H - h + 1; x >= 1; x--)
160                             if (check(x, y, h, w, id, x + r - 1, y + c))
161                                 goto end;
162                     }
163                 }
164             }
165             end: ;
166         }
167         update();
168     }
169     for (int i = 1; i <= H; ++i)
170         for (int j = 1; j <= W; ++j)
171             printf("%d%c", max(ans[i][j], 0), j == W ? ‘\n‘ : ‘ ‘);
172     return 0;
173 }

其实吧,就是个oj+奇迹暖暖,但是妹子的确好看,真香.jpg。

p.s.有谁知道最后那个换装到底怎么搞,请在下面留言,谢谢,我是真看不太懂日文。。。

原文地址:https://www.cnblogs.com/rausen/p/10376710.html

时间: 2024-10-09 09:38:31

程序员死后的世界简单攻略的相关文章

从房产中介到程序员--80后张江男

序言 成都,一座来了就不想离开的城市,此刻,我坐在咖啡厅,享受午后惬意的阳光,等待着相亲女孩的到来.没过多久,一个身穿红色呢子大衣.黑色丝袜.高跟鞋的女孩和她母亲以及介绍人,出现在我的眼帘.这女孩我第一眼满意,干净利落的打扮,飘逸的长发,大衣高跟鞋大红的颜色将唇红的性感淋漓尽致地衬托出来. 到楼下将女孩和几个阿姨领上卡座,翘起二郎腿,靠着沙发,偶尔啜一口饮料,便开始介绍自己的情况. "我叫周勇",今年29岁,30也快了,身高172,体重140斤,独生子女,无负担,目前在高新区环球中心工

前大疆程序员离职后,把代码上传 GitHub,令公司损失百万,获刑半年!

该员工之前在大疆的子公司担任软件工程师,公司对他很器重,负责编写农业无人机的管理平台和农机喷洒系统代码.他在Github 开设账号,并建立了"公有仓库",把代码上传至了 GitHub 公有仓库. 经鉴定,大疆这些泄露出去的代码具有非公知性,且已用于该公司农业无人机产品,属于商业秘密.经评估,这次泄漏公司造成经济损失116.4万元人民币. 案发后,这位员工第一时间删除了相关代码,并积极配合调查,防止事态扩大.他在推特上表示,"无意泄露了大疆的机密"."我很后

谬论之程序员的眼光看世界

曾经阅读霍金先生的时间简史,书中说世界的第四维是时间.当时感觉高深莫测,现在作为程序员,我来说说以我程序员的眼光是怎么来看宇宙的吧. 如今的程序员大部分在使用面向对象的语言来编程.所以,万物皆对象对于程序员来说,还是比较容易理解的.我重新衡量世界观也是从此开始的. 三维世界中,给定原点后,所有的物体都可以使用长宽高来表示.即如今我们的世界只有长宽高三个维度.用数组来表示,可以看做一个三维数组.即用三维数组中的各个点,就可以表示出所有物体的形状. 大家都知道,物质的最小单位是质子,电子,中子等  

哈哈此处有bug:程序员统治的黑暗世界

当我第一次学编程的时候,那个十四岁的少年曾经有一个梦想:未来有一天,我能用我编写的软件统治世界.现在,随着IT技术.尤其是互联网技术的飞速发展,“软件统治世界”已经由不着边际的幻想变成了触手可及的未来可能性.对于这个软件与网络构建的新世界,人类曾经充满美好的构想.John Perry Barlow在1996年的EFF论坛发布的<网络社会独立宣言>中这样说道:“我们正在创造一个世界:在那里,所有的人都可加入,不存在因种族.经济实力.武力或出生地点造成的特权或偏见.”我们曾经满心希望,数字化技术将

程序员跳槽后如何更快的适应新工作

程序员如何更快的融入新的工作环境和新的团队? 1.要有耐心 不要指望能在一两个星期内就学会一个代码库.通常而言,大型的代码库和系统是需要几个月的时间才能够充分理解.所以,别着急,尽力学习的同时也不必给自己施加压力非要立即掌握所有. 2.要谦虚爱学习 对自己不熟悉的工具和方法要抱有谦虚的态度.新的工作就意味着学习新的东西."知之为知之,不知为不知",对自己不知道的东西要谦虚和诚实.并且要记住每一个团队都其独特的工作流程和做事方式.花时间去了解新团队对于工具的选择,以及他们工作流程,并尊重

程序员的成长法则与进阶攻略

一直想对过去职业生涯的成长路线做一个总结性思考,并沉淀为一部作品,今天终于完成了. 1 从毕业到今天,在程序这条道路上已经走了十多年了,前期在金融.电信行业写写程序,最近七年在互联网行业从事电商应用相关系统的技术工作,也一路从程序员成长为了一名架构师. 今天这个时代,对于程序员来说是一个特别幸运的时代.每一个有追求的程序员都希望能获得快速的成长,但成长的道路没那么平坦和舒适,一路上充满了崎岖.障碍和迷雾. 同样,在我成长的道路上,我也走过很多弯路,这一路上我也有过迷茫,有过困惑. 如今,经历了这

女程序员职业发展的特别之处

在"做自己想做的工作"公开课的互动环节,有位女生提了个问题,大意是"女生是否适合做程序员",当时我怎么回答的,已经忘差不多了,大意是性别对是否适合做程序员没有直接影响.课后我又仔细琢磨这个问题,联想到之前有多位女程序员给我的微信订阅号"程序视界"留言,询问女程序员的职业发展状况,这让我恍然发现,我之前居然一直忽略了女性的具体情况对软件开发的影响.因此,这次,我准备特意来聊聊这方面的话题. 首先要说明的是,从大的脉络来讲,女程序员的职业发展与男程序

有哪些好笑的关于程序员的笑话

0. 某女:你能让这个论坛的人都吵起来,我今晚就跟你走. 某软件工程师:PHP 是最好的语言! 某论坛炸锅了,各种吵架... 某女:服了你了,我们走吧你想干啥都行. 某软件工程师:今天不行,我一定要说服他们,PHP 必须是最好的语言某女:....... 1. 你们饭店需要客户端吗? 不忙的时候都是小二端,只有忙的时候才需要客户端. 2. “你们用盗版的时候有想过做出这款软件的程序员吗?!他们该如何养家糊口?” “哈哈哈,别逗了,程序员哪有家要养啊!” 3. 某程序员被一个妹子请去修宽带,那个破电

一个老程序员告诉你:中国程序员为什么要跳槽

程序员 一些人总是发出一些错误的声音,形成了劣胜优汰可怕的现象.他们在误导着中国,把我们的后继军训练成软件蓝领,胸无大志,目光短浅,稍有点成绩就自满就自高自大的人,浑不知天外有天,外国正在虎视眈眈盯着中国的庞大市场. 由于软件蓝领的呼声人们不再致力于培养大批的高精尖人才,掌握国际尖端技术的人.而是花费心思培训一群猪出来给外国人利用.把自己的命运交给了外国人手里.结果,在最容易的管理软件领域也输给外国人,外国人派几个人过来,利用中国的劳动力,开发出软件,再卖给中国.大量的利润到了外国人手里.而我们