9.7 剑心互娱
一、前言
由于和滴滴笔试撞了,写的急的很,0.5 + 0.058 + 0
第一题本来能ac的,少写了个方向,第二题看佬们分享的思路赛后写的,不知道对不对,有没有过的佬看一下。
剑心应该没了
滴滴最后一题区间dp,板子记混了,就拿了0.36,真的能被自己蠢死,比完之后焦虑的睡不着,艹,冷静之后,爬起来又过来写题解了。
9场笔试,0面试,双非鼠,感觉秋招好难阿,纯当分母。
二、题解
1、
样例
输入
5,5 0,0,0,0,0 0,1,1,0,0 0,0,1,1,0 0,0,1,0,0 0,0,1,0,0
输出
4
思路
枚举4个方向,并且标记这个方向是否走过
时间复杂度O(nm)
#include<bits/stdc++.h>
using namespace std;
/*#define int long long*/
#define endl '\n'
#define P pair<int, int>
#define x first
#define y second
const int maxl = 1e3 + 7;
int n, m, ans = 0;
int G[maxl][maxl];
bool flag1[maxl][maxl], flag2[maxl][maxl], flag3[maxl][maxl], flag4[maxl][maxl];
char ch;
void f1(int x, int y) {
int res = 0;
while (G[x][y]) {
flag1[x][y] = 1;
res++;
y++;
}
ans = max(ans, res);
}
void f2(int x, int y) {
int res = 0;
while (G[x][y]) {
flag2[x][y] = 1;
res++;
y++;
x++;
}
ans = max(ans, res);
}
void f3(int x, int y) {
int res = 0;
while (G[x][y]) {
flag3[x][y] = 1;
res++;
x++;
}
ans = max(ans, res);
}
// 这个方向我忘写了,艹
void f4(int x, int y) {
int res = 0;
while (G[x][y]) {
flag3[x][y] = 1;
res++;
x--;
y++;
}
ans = max(ans, res);
}
void solve() {
cin >> ch;
n = ch - '0';
cin >> ch >> ch;
m = ch - '0';
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> ch;
G[i][j] = ch - '0';
if (j != m) cin >> ch;
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (!G[i][j]) continue;
if (!flag1[i][j]) f1(i, j);
if (!flag2[i][j]) f2(i, j);
if (!flag3[i][j]) f3(i, j);
}
}
cout << ans << endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int t = 1;
/*cin >> t;*/
while(t--) solve();
return 0;
}
2、
样例
输入
10 2 1 5 2 5
输出
0
思路
由于这里没有给数据范围,我猜如果t很大,t1和t2很小,那么这样就可以过了。如果有佬过了,麻烦说一下这样对不对,还是说还有其他优化方案。
- 用最小公倍数算周期
- 只需要算出一个周期内的变化就行了
时间复杂度O(lcm(2 * t1, t * t2))
#include <algorithm>
#include<bits/stdc++.h>
using namespace std;
/*#define int long long*/
#define endl '\n'
#define P pair<int, int>
#define x first
#define y second
const int maxl = 1e6 + 7;
int m ,t, m1, t1, m2, t2;
int T, cm, ct;
int cnt;
int f() {
int water = 0;
/*cout << "时间(分)\t" << "增水量\t" << "减水量\t" << "剩余水量\t" << endl;*/
/*cout << string(45, '-') << endl;*/
for (int i = 0; i < T; ++i) {
int increase = 0, decrease = 0;
// 排水
if (i % (t2 * 2) < t2) water -= m2, decrease = m2;
// 进水
if (i % (t1 * 2) < t1) water += m1, increase = m1;
water = min(m, max(0, water));
if (i + 1 == ct) cm = water;
/*cout << i + 1 << "\t\t" << increase << '\t' << decrease << '\t' << water << endl;*/
}
return water;
}
void solve() {
cin >> m >> t >> m1 >> t1 >> m2 >> t2;
T = 4 * t1 * t2 / __gcd(t1 * 2, t2 * 2);
ct = t % T;
cnt = t / T;
cout << cnt * f() + cm << endl;
/*cout << "ct: " << ct << '\t' << " cm: " << cm << endl;*/
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int t = 1;
/*cin >> t;*/
while(t--) solve();
return 0;
}
3、
当时比赛的时候就扫了一眼,感觉很难,然后就去做滴滴了。若果有佬做出来了,分享一下代码呗!
#剑心互娱笔试##笔试#
顺丰集团工作强度 274人发布
查看5道真题和解析