indeed 5.13 第二次网测

题目描述,我找不见了,大概写一下想法和代码吧。

1. 没有看

2. 由于数据范围很小,就是简单的枚举,求全排列,然后更新答案。

 1 #include<bits/stdc++.h>
 2 #define pb push_back
 3 typedef long long ll;
 4 using namespace std;
 5 typedef pair<int, int> pii;
 6 const int maxn = 1e3 + 10;
 7 int n, k, m;
 8 int a[50], b[50], u[50];
 9 bool ina[10], inb[10];
10 int work() {
11     int r = 0;
12     for (int i = 0; i < m; i++) {
13         if(ina[a[i] ] && ina[b[i] ])
14             r += u[i];
15         if(inb[a[i] ] && inb[b[i] ])
16             r += u[i];
17     }
18     return r;
19 }
20 void solve() {
21     cin >> n >> k >> m;
22     for (int i = 0; i < m; i++) {
23         cin >> a[i] >> b[i] >> u[i];
24     }
25     vector<int> p;
26     for (int i = 1; i <= n; i++)
27         p.push_back(i);
28     int res = 0;
29     do {
30         memset(ina, 0, sizeof ina);
31         memset(inb, 0, sizeof inb);
32         for (int i = 0; i < k; i++)
33             ina[p[i] ] = 1;
34         for (int i = k; i < k * 2; i++)
35             inb[p[i] ] = 1;
36         res = max(res, work());
37     } while(next_permutation(p.begin(), p.end()));
38     cout << res << endl;
39 }
40
41 int main() {
42     freopen("test.in", "r", stdin);
43     //freopen("test.out", "w", stdout);
44     ios::sync_with_stdio(0);
45     cin.tie(0); cout.tie(0);
46     solve();
47     return 0;
48 }

3. 这次第三题挺有意思的,求左上角到右下角的最短路径,但是多了一种跳的操作。

我的想法很简单,由于在每一个点上都可以选择跳与不跳,而且只能一次跳, 那就预处理出每个点到起始点的距离,每个点到终点的距离,然后遍历每一个点,更新答案。

一个是这个点到起点的距离加上到终点的距离, 一个是这个点到起点的距离 + 1(完成跳的动作) + 跳之后的点到终点的距离。更新答案。

 1 #include<bits/stdc++.h>
 2 #define pb push_back
 3 typedef long long ll;
 4 using namespace std;
 5 typedef pair<int, int> pii;
 6 const int maxn = 1e3 + 10;
 7 const int inf = 1e5;
 8 int h, w, d, r;
 9 string a[15];
10 int sdis[15][15], edis[15][15];
11 int dx[] = {0, 0, 1, -1};
12 int dy[] = {1, -1, 0, 0};
13 bool check(int x, int y) {
14     if(x < 0 || x >= h || y < 0 || y >= w) return 0;
15     return 1;
16 }
17 void dfs(int x, int y, int v) {
18     sdis[x][y] = v;
19     for (int i = 0; i < 4; i++) {
20         int cx = x + dx[i], cy = y + dy[i];
21         if(check(cx, cy) && a[cx][cy] != ‘#‘ && sdis[cx][cy] > v + 1) {
22             dfs(cx, cy, v + 1);
23         }
24     }
25 }
26 void dfs1(int x, int y, int v) {
27     edis[x][y] = v;
28     for (int i = 0; i < 4; i++) {
29         int cx = x + dx[i], cy = y + dy[i];
30         if(check(cx, cy) && a[cx][cy] != ‘#‘ && edis[cx][cy] > v + 1) {
31             dfs1(cx, cy, v + 1);
32         }
33     }
34 }
35 void solve() {
36     cin >> h >> w >> d >> r;
37     for (int i = 0; i < h; i++)
38         cin >> a[i];
39     for (int i = 0; i < h; i++) {
40         for (int j = 0; j < w; j++)
41             sdis[i][j] = edis[i][j] = inf;
42     }
43     dfs(0, 0, 0);
44     dfs1(h - 1, w - 1, 0);
45     int res = inf;
46     for (int i = 0; i < h; i++) {
47         for (int j = 0; j < w; j++) {
48             int t1 = sdis[i][j] + edis[i][j];
49             res = min(res, t1);
50             int x = i + d, y = j + r;
51             if(check(x, y)) {
52                 int t2 = sdis[i][j] + edis[x][y] + 1;
53                 res = min(res, t2);
54             }
55
56         }
57     }
58     if(res == inf) res = -1;
59     cout << res << endl;
60 }
61
62 int main() {
63     freopen("test.in", "r", stdin);
64     //freopen("test.out", "w", stdout);
65     ios::sync_with_stdio(0);
66     cin.tie(0); cout.tie(0);
67     solve();
68     return 0;
69 }

4. 目标函数是差的绝对值乘以权值之和, 考虑权值都相等的时候,这时候的最佳点就是中间的那个点(奇数个点是中间点,偶数个点是中间2个点之间的点都行)。

下面考虑权值r不相等的时候,这个函数其实是凹的, 这个性质很重要,可以进行二分查找,目标点是该点比它左右2点的函数值都要小, 如果该点比左边大,比右边小,那查找区间往左移动,否则往右移动。

 1 #include<bits/stdc++.h>
 2 #define pb push_back
 3 typedef long long ll;
 4 using namespace std;
 5 typedef pair<int, int> pii;
 6 const int maxn = 1e5 + 10;
 7 ll len;
 8 int n;
 9 ll a[maxn];
10 int r[maxn];
11 ll work(ll x) {
12     ll res = 0;
13     for (int i = 0; i < n; i++) {
14         res += abs(a[i] - x) * r[i];
15     }
16     return res;
17 }
18 void solve() {
19     scanf("%lld%d", &len, &n);
20     for (int i = 0; i < n; i++) {
21         scanf("%lld%d", &a[i], &r[i]);
22     }
23     ll left = 0, right = len;
24     ll res = -1;
25     while(left < right) {
26         ll mid = (left + right) / 2;
27         ll r = work(mid);
28         ll r1 = work(mid - 1);
29         ll r2 = work(mid + 1);
30         if(r <= r1 && r <= r2) {
31             left = right = mid;
32             break;
33         } else if(r1 <= r && r <= r2) {
34             right = mid - 1;
35         } else if(r1 >= r && r >= r2) {
36             left = mid + 1;
37         }
38     }
39     if(left < 0) left++;
40     if(left > len) left--;
41     printf("%lld\n", work(left));
42 }
43
44 int main() {
45     freopen("test.in", "r", stdin);
46     //freopen("test.out", "w", stdout);
47     solve();
48     return 0;
49 }

时间: 2024-11-29 09:04:19

indeed 5.13 第二次网测的相关文章

2015 CVTE校招网测部分试题(技术类)

CVTE的网测题分为技术题与行测题,都非常基础非常简单,但也有较难的题目,下面这些题都是我当时觉得稍有些难或容易答错或值得进一步推敲的题,现在分享出来,大家可以对着知识点做下,不会的Google,务必将每一个知识点都弄懂. 注意:下面的试题已选项不代表真实答案,但鼓励大家将自己的答案贴在下面,好互相对照.

[电影分享]陈二狗的妖孽人生第二季--网剧

百度网盘链接: 链接: http://pan.baidu.com/s/1jHF4RRo 密码: xmus

暑假第二十四测

题解: 第一题:二分+贪心:二分距离上限,两端的人能从两端取就从两端取,这样可以为中间的做贡献: #include<bits/stdc++.h> using namespace std; const int M = 10005; int a[M], b[M], pos[M], x, n, m; bool id[M]; #define ll long long inline int ab(int a, int b){ if(a > b)return a - b; return b - a;

暑假第二十五测

以后WA了T了看数组: 暑假四次数组下标超界,多次数组开小,暂时没有访问到负下标 题解: 第一题:这道题可以转换为颜色相同的点缩成一个点,每次可以将两个点合并成同一点,问最少几次将所有点合并成一个点: 开始想到并查集+贪心合并度数最多的并查集,但这样是有问题的,比如度数一样时,选择的先后顺序是有影响的: 正解:缩点+找直径,如果是一条黑白相间的链,就是点数/2, 而树上任何一条直径都会有一个点经过直径,我们从交点开始往外延伸,发现最长延伸就是直径本身: 思想:从特殊到一般 #include<bi

暑假第二十六测

今天又考的奇差 题解: 第一题: 这么简单一道题我想了好久,智商实在是下线了: #include<bits/stdc++.h> using namespace std; int main(){ freopen("shortway.in","r",stdin); freopen("shortway.out","w",stdout); int n, k; scanf("%d%d", &n,

暑假第二十九测

第三题换成能否得到x, 可以1, 不可以-1 题解: 第一题:打表找规律: 打表发现a是:1 1 2 2 3 4 4 4 5 6 6 7 8 8 8 8 9-- 对于每一项Ai = i拆分成质因数中有多少个2 + 1:如果把桶也给打出来,就发现他是这样的: 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 2 + 4 + 6 + 8 +  4  + 8 +  8 + 即2^i的等差数列,所以对一个数m我们就很容易确定他前面的数的和: 但是对于一个位置我们怎么找到他对应的m呢? 把上

fiddler(13)弱网

菜单位置: 开关:Rules  -- Performance   -- Simulate Modem Speeds (模拟网络限速)网速变量:Rules -- Customize Rules...   Ctrl+R   | 搜索:[m_SimulateModem]  生效的条件:开关打开,  同时  网速开关有值:单位:ms 原文地址:https://www.cnblogs.com/focusta/p/12150317.html

【indeed网测题】D - Yakiniku

怨念啊,边做边辅导wy.福鸡,最后还剩点时间做这题,发现挺不错的.推出个很靠谱的式子,但是不懂怎么优化,最后快结束时敲个暴力,以为赛后能提交,结果结束后界面打不开了.贴下代码. 题意是,烧烤n串食物,给出n串食物的放入时间点s[i]和拿走时间点t[i],但是拿走的时候,认不出哪个是第i个食物,会等概率随机选一个.然后问你最后每个食物没被烤熟预计考得太熟的概率分别是多少,就是在t[i]前拿走和t[i]后拿走的概率.所有的时间点s.t都不相同.以下是暴力代码,n^2的,不懂对不对,感觉挺靠谱的.再想

第二章 自测

1. 填空题 (1) $\frac12 f'(x_0)$ 令 $x=x_0+ \Delta x$, 则得\[  \mbox{原式}=\lim_{\Delta x\to 0}   \frac{  f(x_0 +\frac{\Delta x}{2} )-f(x_0)}{ \Delta x }   =\frac12\lim_{\Delta x\to 0}   \frac{  f(x_0 +\frac{\Delta x}{2} )-f(x_0)}{ \frac{\Delta x}{2} }=\frac1