爬格子呀--IEEE极限编程大赛留念

在电子科技大学举行的IEEE极限编程大赛中,参赛者经历了24小时不间断的编程挑战。尽管排名不理想,但这次经历被视为新的起点。比赛中涉及的算法问题包括:狮子领地重叠计算、人按身高和名字排序、最短路径规划、生命游戏模拟以及长方形区域数字异或和计算等。每个问题都伴随着简洁的代码示例。
摘要由CSDN通过智能技术生成

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() {
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值