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() {