三道笔试,全是编程。AC了前两道,记录一下。
题目图片来自牛客网
https://www.nowcoder.com/discuss/405887?type=post&order=create&pos=&page=1
1
思路:把补给品取出来,按距离排序,逐一砍下。multimap容器非常适合本题。下面是AC的代码:
#include <cmath>
#include <map>
#include <vector>
#include <iostream>
using namespace std;
long long func(vector<vector<int> > &table, int l, int x, int y)
{
multimap<double, int> want;
for (int i = 0; i < table.size(); ++i)
{
for (int j = 0; j < table.size(); ++j)
{
if (table[i][j] > 0)
{
double dis = sqrt((i - x) * (i - x) + (j - y) * (j - y));
int value = table[i][j];
want.insert({dis, value});
}
}
}
long long res = l;
for (auto it = want.begin(); it != want.end();)
{
//cout << it->first << ' ';
if (it->first - res < 0.00000000000000000001)
{
res += it->second;
++it;
}
else
break;
}
//cout << endl;
return res;
//long long res = l;
}
int main()
{
int t;
cin >> t;
while (t--)
{
int m, l, x, y;
cin >> m >> l;
vector<vector<int> > table(m, vector<int>(m));
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < m; ++j)
{
cin >> table[i][j];
}
}
cin >> x >> y;
cout << func(table, l, x, y) << endl;
}
return 0;
}
上面代码还可以优化,距离只是用来比较,可以用平方来比较,从而不必开方引入double数据。
2
思路:用set表示集合,放入vector中表示全部的集合,用map记录每个数所在的集合。下面是AC的代码
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
int t;
while(cin >> t)
{
while (t--)
{
int n, m;
cin >> n >> m;
map<int, int> ma;
vector<set<int> > vs(n + 1);
for (int i = 1; i <= n; ++i)
{
ma[i] = i;
vs[i].insert(i);
}
while (m--)
{
int op, x, y;
cin >> op;
if (op == 1)
{
cin >> x >> y;
if (ma[x] != ma[y])
{
int k = ma[y];
while (!vs[k].empty())
{
int v = *(vs[k].begin());
vs[k].erase(vs[k].begin());
vs[ma[x]].insert(v);
ma[v] = ma[x];
}
//cout << vs[ma[y]].size() << ' ' << vs[ma[x]].size() << endl;
}
}
else if (op == 2)
{
cin >> x;
if (vs[ma[x]].size() != 1)
{
for (int i = 1; i <= n; ++i)
{
if (vs[i].empty())
{
//cout << "new place" << endl;
vs[i].insert(x);
vs[ma[x]].erase(x);
ma[x] = i;
break;
}
}
}
}
else
{
cin >> x;
cout << vs[ma[x]].size() << endl;
}
}
}
}
return 0;
}
3
这题没做,可以参考这里的讨论:
https://www.nowcoder.com/discuss/405821?type=post&order=time&pos=&page=3
https://www.nowcoder.com/discuss/405922?type=post&order=time&pos=&page=1