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、

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

#剑心互娱笔试##笔试#
全部评论
只能说 我刚做完 跟你这个7好的一模一样 裂开没有早点看到
3 回复 分享
发布于 09-21 17:22 河北
我去,刚做完第一题越界了,只过了2/3,还有这输入也太麻烦了吧
1 回复 分享
发布于 09-21 17:34 河南
第二题我只过了30%,后面想想写了一下,应该没问题 public static double CalWater(int t, int m, int t1, int m1, int t2, int m2) { int enterWaterT = (t / (2 * t1)) * t1 + (Math.Min(t1, t % (2 * t1))); // 进水闸时长 int exitWaterT = (t / (2 * t2)) * t2 + (Math.Min(t2, t % (2 * t2))); // 出水阀时长 double enterWaterN = m1 * enterWaterT; double exitWaterN = m2 * exitWaterT; double result = Math.Max(0, Math.Min(m, enterWaterN - exitWaterN)); return result; }
1 回复 分享
发布于 09-21 17:45 辽宁
今天的三道题跟你这个一摸一样的,都超时了gg
1 回复 分享
发布于 10-12 20:31 广东
一模一样的题,为什么没有早点看到
1 回复 分享
发布于 10-12 20:31 贵州
NND,没看到这里,今天考的原题啊
1 回复 分享
发布于 10-12 21:22 陕西
兄弟,操作系统的题目多不
点赞 回复 分享
发布于 09-19 21:36 湖南
第二题不能直接用周期计算吧,那得要求周期开始和结束的时候,水池的水一样多。如果水池的水每个周期都减少,在若干个周期后,应该就会有本来有出水的时间,结果水池这个时间是空的,反之,则是原本没流水的时间,现在流水了。打个比方,进水周期为2,出水为3,速率均为1。一个周期为12个时间步。依次为:2个单位的进出水,一个单位的出水,一个单位均没开,2单位的进水,2单位的出水,1单位的进出水,一单位的进水。在第一个周期结束后,其结果为1,第二个周期开始时,到第一次出水,第一个周期此时的水为0,第二个周期此时的水为1.第二个周期的结果还是1。当然,也有可能我理解错你的意思了。
点赞 回复 分享
发布于 10-24 15:19 上海

相关推荐

7 14 评论
分享
牛客网
牛客企业服务