爬格子呀--IEEE极限编程大赛留念
10.14,坐标:电子科技大学
24h,不间断的编程,感觉还是很爽的。
排名一般,但是这是开始,未来还很远。
题目举例1:
广袤的非洲大草原上,狮子居住在一个个的网格里,他们的势力范围会以曼哈顿路程的的方式给出,求出哪个狮子重叠在其他狮子领地里的次数最少。
代码如下:
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<utility>
using namespace std;
int n, m, k, ri, ci, di;
int sign[1000][1000];
void draw() {
int i, j;
for (i = ri - di + 1; i < ri+di; i++) {
for (j = ci - di + 1; j < ci+di; j++) {
if (i < 0 || j < 0 || i >= n || j >= m)
continue;
if (i == ri&&j == ci) {
sign[i][j]--;
}
sign[i][j]++;
}
}
int row1, row2, col1, col2;
if ((row1 = ri - di) >= 0) sign[row1][ci]++;
if ((row2 = ri + di) < n) sign[row2][ci]++;
if ((col1 = ci - di) >= 0) sign[ri][col1]++;
if ((col2 = ci + di) < m) sign[ri][col2]++;
}
int main() {
vector<int>row, col;
map<int, vector<int>>s;
cin >> n >> m >> k;
int i = 0;
while (i++ < k) {
cin >> ri >> ci >> di;
ri--; ci--;
row.push_back(ri);
col.push_back(ci);
draw();
}
i = 0;
vector<int>::iterator it = row.begin(), ittt = col.begin();
set<int>ss;
while (i++ < k) {
s.insert(make_pair(sign[*it][*ittt], i));
it++;
ittt++;
}
map<int, vector<int>>::iterator tar = s.end();
advance(tar, -1);
sort(tar->second.begin(), tar->second.end());
cout << *(tar->second).begin() << " " << tar->first;
return 0;
}
题目举例2:
有一堆人,每个人都有身高,将人按身高排序,同样身高的放到一行,同时按名字排序,每一行的最后输出这一行人的始编号和末编号,
代码如下:
#include<stdio.h>
#include<iostream>
#include<map>
#include<vector>
#include<string>
#include<utility>
#include<algorithm>
using namespace std;
multimap<int, string>num;
int n;
int main() {
cin >> n;
int t = 0, height;
string s;
while (t < n) {
cin >> s >> height;
num.insert(make_pair(height, s));
t++;
}
vector<string>store[1000];
multimap<int, string>::iterator it = num.begin(), itt = num.begin();
int k = 0;
for (; it != num.end(); it++) {
if (it->first == itt->first) {
store[k].push_back(it->second);
}
else {
k++;
itt = it;
store[k].push_back(it->second);
}
}
vector<string>::iterator iet;
int time = 0, init = 1;
for (int j = 0; j <= k; j++) {
sort(store[j].begin(), store[j].end());
for (iet = store[j].begin(); iet != store[j].end(); iet++) {
cout << *iet << " ";
time++;
}
printf("%d %d\n", init, time);
init = time+1;
}
return 0;
}
题目举例3:
有一个n*n的地图,你从(0,0)出发,目的地是(n,n), 一路上只能像下走或者向右走,每个格子都有血药或者毒药,走上去会按药的数量扣血或加血,计算开始时的应该有的最低血量。
代码如下:
#include<stdio.h>
#include<iostream>
#include<vector>
using namespace std;
int r, c, health;
int rev_div[2][2] = { {-1,0},{0,-1} };
//vector<vector<int>>step;
struct {
int potion;
bool state = false;
}unit[1000][1000];
void init() {
int i = 0, j = 0;
while (i < r) {
unit[i][0].potion += unit[i + rev_div[0][0]][0].potion;
i++;
}
while (j < c) {
unit[0][j].potion += unit[0][j + rev_div[1][1]].potion;
j++;
}
}
int main() {
cin >> r >> c;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
cin >> unit[i][j].potion;
}
}
// struct type position;
init();
int mid = 0;
while (1) {
int i = 1, j = 1;
while (i < r) {
while (j < c) {
mid = unit[i + rev_div[0][0]][j + rev_div[0][1]].potion > unit[i + rev_div[1][0]][j + rev_div[1][1]].potion ? unit[i + rev_div[0][0]][j + rev_div[0][1]].potion : unit[i + rev_div[1][0]][j + rev_div[1][1]].potion;
unit[i][j].potion += mid;
j++;
}
j = 1;
i++;
}
health = (unit[r-1][c-1].potion > 1 ? 1 : 1 - unit[r-1][c-1].potion);
break;
}
cout << health;
return 0;
}
题目举例4:
这道题就是生命游戏的实现,要求左边界与右边界相接,上边界与下边界相接,输出迭代n次后的结果。
代码如下:
1: 啰里啰唆版:
#include<cstdio>
#include<iostream>
using namespace std;
char cell[26][26], new_cell[26][26];
int n, m, c;
int get_neigh(int row,int col) {
int count=0, i, j;
//左上
if (row == 0 && col == 0) {
if (cell[0][1] == '*') count++;
if (cell[1][1] == '*') count++;
if (cell[1][0] == '*') count++;
if (cell[n-1][0] == '*') count++;
if (cell[n-1][1] == '*') count++;
if (cell[n-1][m-1] == '*') count++;
if (cell[0][m-1] == '*') count++;
if (cell[1][m-1] == '*') count++;
return count;
}
//左下
else if (row == n-1 && col == 0) {
if (cell[n-2][0] == '*') count++;
if (cell[n-1][1] == '*') count++;
if (cell[n-2][1] == '*') count++;
if (cell[n - 1][m-1] == '*') count++;
if (cell[n - 2][m-1] == '*') count++;
if (cell[0][0] == '*') count++;
if (cell[0][1] == '*') count++;
if (cell[0][m - 1] == '*') count++;
return count;
}
//右上
else if (row == 0 && col == m - 1) {
if (cell[0][0] == '*') count++;
if (cell[1][0] == '*') count++;
if (cell[0][m - 2] == '*') count++;
if (cell[1][m - 2] == '*') count++;
if (cell[1][m - 1] == '*') count++;
if (cell[n - 1][0] == '*') count++;
if (cell[n - 1][m - 2] == '*') count++;
if (cell[n - 1][m - 1] == '*') count++;
return count;
}
//右下
else if (row == n-1 && col == m-1) {
if (cell[0][0] == '*') count++;
if (cell[n-1][m-2] == '*') count++;
if (cell[n-2][m - 2] == '*') count++;
if (cell[n-2][m - 1] == '*') count++;
if (cell[n-1][0] == '*') count++;
if (cell[n - 2][0] == '*') count++;
if (cell[0][m - 2] == '*') count++;
if (cell[0][m - 1] == '*') count++;
return count;
}
//首行
else if (row == 0) {
for (i = row; i <= row + 1; i++) {
for (j = col - 1; j <= col + 1; j++) {
if (cell[i][j] == '*')
count++;
}
}
for (j = col - 1; j <= col + 1; j++) {
if (cell[n-1][j] == '*')
count++;
}
if (cell[row][col] == '*')
count--;
return count;
}
//末行
else if (row == n - 1) {
for (i = row-1; i <= row; i++) {
for (j = col - 1; j <= col + 1; j++) {
if (cell[i][j] == '*')
count++;
}
}
for (j = col - 1; j <= col + 1; j++) {
if (cell[0][j] == '*')
count++;
}
if (cell[row][col] == '*')
count--;
return count;
}
//首列
else if (col == 0) {
for (i = row-1; i <= row + 1; i++) {
for (j = col ; j <= col + 1; j++) {
if (cell[i][j] == '*')
count++;
}
}
for (i = row - 1; i <= row + 1; i++) {
if (cell[i][m-1] == '*')
count++;
}
if (cell[row][col] == '*')
count--;
return count;
}
//末列
else if (col == m) {
for (i = row - 1; i <= row + 1; i++) {
for (j = col-1; j <= col ; j++) {
if (cell[i][j] == '*')
count++;
}
}
for (i = row - 1; i <= row + 1; i++) {
if (cell[i][0] == '*')
count++;
}
if (cell[row][col] == '*')
count--;
return count;
}
//一般
else {
for (i = row - 1; i <= row + 1; i++) {
for (j = col - 1; j <= col + 1; j++) {
if (cell[i][j] == '*')
count++;
}
}
if (cell[row][col] == '*')
count--;
return count;
}
}
int main() {
cin >> n >> m >> c;
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
cin >> cell[i][j];
}
}
int kase = 0;
while (kase < c) {
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
switch (get_neigh(i, j))
{
case 0:
case 1:
case 4:
case 5:
case 6:
case 7:
case 8:
new_cell[i][j] = '-';
break;
case 2:
new_cell[i][j] = cell[i][j];
break;
case 3:
new_cell[i][j] = '*';
break;
}
}
}
kase++;
}
cout << endl;
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
cout << cell[i][j];
}
cout << endl;
}
return 0;
}
代码举例2:
这个最后改的挺多的,其实按照第一个的大思路然后把拿这个的邻居计算思路就行。
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
int n, m, c;
//获取邻居数;
int get_neigh(int row, int col, char (*cell)[26]) {
int count = 0, i, j;
for (i = -1; i <= 1; i++) {
for (j = -1; j <= 1; j++) {
if (cell[(row + i + n) % n][(col + j + m) % m] == '*')
count++;
}
}
if (cell[row][col] == '*')
count--;
return count;
}
void change(char (*mat1)[26], char (*mat2)[26]) {
int i, j, num;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
num = get_neigh(i, j, mat1);
if (num == 2) mat2[i][j] = mat1[i][j];
else if (num == 3) {
mat2[i][j] = '*';
}
else {
mat1[i][j] = '-';
}
}
}
}
int main() {
char cell[26][26], new_cell[26][26] = {};
cin >> n >> m >> c;
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
cin >> cell[i][j];
}
}
int kase = 1;
while (kase <= c) {
if (kase % 2 != 0)
change(cell, new_cell);
else
change(new_cell, cell);
kase++;
}
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
cout << new_cell[i][j];
}
cout << endl;
}
return 0;
}
题目举例5:有好多个长方形,每个长方形中间都会包一个小的长方形,大长方形已经内部已经一个一个小格的依次编号,题目会给出你小长方形的两个对角线顶点,计算每个长方形在小长方形之外的所有数字的异或和
代码如下:
#include<stdio.h>
#include<iostream>
#include<set>
#include<algorithm>
#include<cmath>
using namespace std;
long long xor1;
int t;
set<int>s;
struct {
int l, h, d1, d2;
long long val;
int length, width, position;
}rec[100];
int main() {
cin >> t;
int i = 0, j = 0;
while (i < t) {
cin >> rec[i].l >> rec[i].h >> rec[i].val >> rec[i].d1 >> rec[i].d2;
int a1, a2, b1, b2, min1, min2;
a1 = (rec[i].d1 - rec[i].val + 1) % rec[i].l;
a2 = (rec[i].d2 - rec[i].val + 1) % rec[i].l;
b1 = (rec[i].d1 - rec[i].val + 1) / rec[i].l;
b2 = (rec[i].d2 - rec[i].val + 1) / rec[i].l;
min1 = a1 > a2 ? a2 : a1;
min2 = b1 > b2 ? b2 : b1;
rec[i].position = rec[i].l*min2 + min1;
rec[i].length = abs(a1 - a2) + 1;
rec[i].width = abs(b1 - b2) + 1;
i++;
}
set<int>::iterator it ,itt;
for (i = 0; i < t; i++) {
j = 0;
while (j < rec[i].l*rec[i].h) {
s.insert(rec[i].val++);
j++;
}
it = s.begin();
advance(it, rec[i].position-1);
itt = it;
advance(it, rec[i].length);
for (j = 0; j < rec[i].width; j++) {
s.erase(itt, it);
itt = it;
advance(it, rec[i].l);
advance(itt, rec[i].l - rec[i].length);
}
itt = it = s.begin();
for (; it != s.end(); it++) {
xor1 ^= *it;
}
cout << xor1 << endl;
xor1 = 0;
s.clear();
}
return 0;
}
题目举例6:求斐波那契数列的前n项值(这个n上界是22400)
代码举例:
#include <iostream>
#include<stdio.h>
#include<vector>
#include<string>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
struct Bigintegar {
static const int BASE = 100000000;
static const int WIDTH = 8;
vector<int>s;
Bigintegar(long long num = 0) { *this = num; }
Bigintegar operator = (long long num) {
s.clear();
do {
s.push_back(num%BASE);
num /= BASE;
} while (num > 0);
return *this;
}
Bigintegar operator=(const string& str) {
s.clear();
int x, len = (str.length() - 1) / WIDTH + 1;
for (int i = 0; i < len; i++) {
int end = str.length() - i*WIDTH;
int start = max(0, end - WIDTH);
sscanf(str.substr(start, end - start).c_str(), "%d", &x);
s.push_back(x);
}
return *this;
}
Bigintegar operator + (const Bigintegar& b)const {
Bigintegar c;
c.s.clear();
for (int i = 0, g = 0;; i++) {
if (g == 0 && i >= s.size() && i >= b.s.size()) break;
int x = g;
if (i < s.size())x += s[i];
if (i < b.s.size())x += b.s[i];
c.s.push_back(x%BASE);
g = x / BASE;
}
return c;
}
};
ostream& operator<<(ostream &out, const Bigintegar& x) {
out << x.s.back();
for (int i = x.s.size() - 2; i >= 0; i--) {
char buf[20];
sprintf(buf, "%08d", x.s[i]);
for (int j = 0; j < strlen(buf); j++) out << buf[j];
}
return out;
}
Bigintegar fibMinus1 = 1;
Bigintegar fibMinus2 = 2;
Bigintegar fibN;
Bigintegar step(int n)
{
for (int i = 2; i < n; i++)
{
fibN = fibMinus1 + fibMinus2;
fibMinus1 = fibMinus2;
fibMinus2 = fibN;
}
return fibN;
}
int main()
{
int s, kase;
int t, i = 0, k;
cin >> t;
while (i<t) {
cin >> k;
i++;
}
i = 0;
}
爬格子呀--IEEE极限编程大赛留念的更多相关文章
- 2018 IEEE极限编程大赛 题解
去年742,今年72,也算一种小小的进步. 明年前30(笑 1. Drawing Rooted Binary Trees 给定一个树的中序和前序的遍历,要求输出这棵树(包括空格的) #include ...
- IEEEXtreme 极限编程大赛题解
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 IEEEXtreme全球极限编程挑战赛,是由IEEE主办,IEEE学生分会组织承办.IEEE会员参与指导和监督的.IEEE学生会员以团队 ...
- IEEEXtreme 10.0 - Inti Sets
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Inti Sets 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank.c ...
- IEEEXtreme 10.0 - Dog Walking
博客中的文章均为 meelo 原创,请务必以链接形式注明 本文地址 Xtreme 10.0 - Dog Walking 题目来源 第10届IEEE极限编程大赛 https://www.hackerra ...
- IEEEXtreme 10.0 - Painter's Dilemma
这是 meelo 原创的 IEEEXtreme极限编程比赛题解 Xtreme 10.0 - Painter's Dilemma 题目来源 第10届IEEE极限编程大赛 https://www.hack ...
- IEEEXtreme 10.0 - Ellipse Art
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Ellipse Art 题目来源 第10届IEEE极限编程大赛 https://www.hackerrank ...
- IEEEXtreme 10.0 - Counting Molecules
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Counting Molecules 题目来源 第10届IEEE极限编程大赛 https://www.hac ...
- IEEEXtreme 10.0 - Checkers Challenge
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Checkers Challenge 题目来源 第10届IEEE极限编程大赛 https://www.hac ...
- IEEEXtreme 10.0 - Game of Stones
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Game of Stones 题目来源 第10届IEEE极限编程大赛 https://www.hackerr ...
随机推荐
- jquery + ajax 提交数据报错
报错 Forbidden (CSRF token missing or incorrect.): /account/test/ [20/Oct/2016 18:10:44] "POST /a ...
- oracle11g-R2数据库的逻辑备份(数据泵的导入导出)
一.环境: server1迁移到server2 server1: 服务器号:201 系统:Windows server 2008 R2 x64 IP地址:192.168.2.201 oracle数据库 ...
- 【GET TIPS】Chrome所见即所得的截图技巧
精简的前言: 对,我就是想说下事情的来龙去脉.您要不想听,就把耳朵捂起来23333. 想截个新冠肺炎病毒,全国确诊人数今日增长的图,以确定非湖北地区不再明显增长. 但由于网页需要的内容分布在两页,需要 ...
- 消息队列MQ(一)
消息队列 为什么要用消息队列,都有什么优缺点? 要问的是消息队列都有哪些场景,然后项目里具体实现的什么场景,你在这个场景里用的什么消息队列? 期望的回答是,你们公司有个什么业务,这个业务场景有什么技术 ...
- npm常用命令和脚手架使用
最近前端同学使用最多的莫过于vue,angualr,react等热门前端框架了.那么就避免不掉的使用npm命令,本人就经常因为这三个脚手架的使用而不得不百度相应的npm命令,不胜其烦,,,因此就整理一 ...
- U盘装系统/win to go制作笔记
//添加图片太麻烦了吧,我扔相册里了,需要自取吧. //U盘装系统 环境:win10戴尔灵越台式机 硬件:16G U盘,Windows电脑 软件:老毛桃启动装机工具,win10镜像1803版本 进入网 ...
- web自动化之三大等待
这个假期有些长,长到忘记了要学习,要找工作,好吧,在我每天无休止的追着偶像剧时,我确实没有负罪感,在听了小祥大佬的分享后,我连睡午觉都被吓醒.大佬跟我同一个班,在大厂工作,每天还抽时间学习,作业也没落 ...
- python 语言打印直角三角形的几种方法
方法1:全部打印语句 print('*') print('**') print('***') print('****') 方法2:简单使用循环 for i in range(5): print('*' ...
- MySQL快速回顾:数据库和表操作
前提要述:参考书籍<MySQL必知必会> 利用空闲时间快速回顾一些数据库基础. 4.1 连接 在最初安装MySQL,可能会要求你输入一个管理登录(通常为root)和一个口令(密码). 连接 ...
- P2746 [USACO5.3]校园网Network of Schools [tarjan缩点]
题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 BB 在 AA 学校的分发列表中,AA 也不一定在 BB 学校的列表中. ...