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、

当时比赛的时候就扫了一眼,感觉很难,然后就去做滴滴了。若果有佬做出来了,分享一下代码呗!

#剑心互娱笔试##笔试#
全部评论

相关推荐

2 1 评论
分享
牛客网
牛客企业服务