2022-08-30-之江实验室笔试-1h两题100%

// 最多AK人数
// 时间限制: 1000MS
// 内存限制: 65536KB
// 题目描述:
//        招聘季又到了,各公司的线上笔试又要开始了,已知某公司十分缺人手,他们希望尽可能多的人可以进入复试。而进入复试的条件只有一个,就是线上笔试拿到满分。
//        已知在该公司的题库***有m道题,编号为从1到m,一共有n个人会参加笔试。该公司的笔试分为两场,请你将这m道题分成两套,每套题至少有一道,每道题都要使用。
//        已知这n个人每个人能解出的题目编号都是连续的若干道题,我们用“L R”的方式描述,表示某个人可以解出第L道题到第R道题。
//        每个人只要在其中一场笔试拿到满分就可以进入复试。请问最多有多少人可以进入复试。
// 输入描述
//         输入第一行包含两个正整数n和m(1<=n<=50000,1<=m<=100000);
//         接下来有n行,每行有两个正整数L_i和R_i,表示第i个人可以解出第L_i题到第R_i题。
// 输出描述
//         输出仅包含一个整数,表示最多有多少人可以进入复试。

// 样例输入
// 4 8
// 4 7
// 1 4
// 5 8
// 2 5
// 样例输出
// 3

// #include<iostream>
// #include<vector>
// using namespace std;

// int main(){
//   int n,m;cin>>n>>m;
//   // vector<vector<int>> c(n,vector<int>(2));
//   // for(int i=0;i<n;i++){
//   //   cin>>c[i][0]>>c[i][1];
//   // }
//   //sort(c.begin(),c.end());
//   vector<int> d(m+2,0);
//   int l,r;
//   for(int i=0;i<n;i++){
//     cin>>l>>r;
//     d[l]+=1;
//     d[r+1]--;
//   }
//   int c=0;
//   int maxc=1;
//   for(int i=1;i<=m;i++){
//     c+=d[i];
//     if(maxc<c)
//       maxc=c;
//   }
//   cout<<maxc;
//   return 0;
// }

// 糖果屋
// 时间限制: 1000MS
// 内存限制: 65536KB
// 题目描述:
//       万圣节要到了,小朋友们要来要糖果了,糖果店为了打广告,举办了这样一个活动,前n+1个索要糖果的小朋友都是可以拿到糖果的,每一个小朋友都至少要发一块糖果,但是还有一个抽卡环节,糖果店准备了n张卡,前n个小朋友会分别取一张,卡片有两种,第一种是‘+’,抽到这张卡就意味着,下一个小朋友拿到的糖果比自己多,第二种是‘-’,抽到这张卡意味着,下一个小朋友拿到的糖果比自己少。
//        糖果店的糖果是在前n个小朋友都抽完卡以后统一发放的,请问糖果屋最少发放多少糖果,才能符合抽卡的结果。
// 输入描述
// 输入第一行仅包含一个正整数n,表示卡片的数量。(1<=n<=500000)
// 输入第二行是一个长度为n的字符串,仅包含“+,-”两种符号。
// 输出描述
// 输出仅包含一个正整数,表示糖果店最少发出的糖果数量。

// 样例输入
// 3
// --+
// 样例输出
// 8

// 提示
// 最少的发放糖果的方案是{3,2,1,2}

// O(n) 空间
// #include <iostream>
// #include <vector>
// using namespace std;

// int main()
// {
//     int n;
//     cin >> n;
//     string s;
//     cin >> s;
//     // n=3;s="+--";
//     vector<int> f(n + 1, 0);
//     f[0] = 1;
//     int ans = 1;

//     int c_ = 0;
//     int cp = 0; // debug1: 本来没有cp和lastPlus这一套流程跟踪最后一个加法后的值
//     int lastPlus = 0;
//     for (int i = 0; i < s.length(); i++)
//     {
//         if (s[i] == '+')
//         {
//             f[i + 1] = f[i] + 1;
//             ans += f[i + 1];
//             if (c_ == 0)
//                 cp++;
//             else
//             {
//                 cp = 1; // debug3: 本来是1,36%
//                 c_ = 0;
//             }
//         }
//         else
//         {
//             f[i + 1] = 1;
//             if (cp > 0)
//             {
//                 lastPlus = f[i] - 1; // 最后一个加号对应的值-1(可以减多少次)
//                 cp = 0;
//             }
//             else
//             {
//                 if(lastPlus==0)
//                 {
//                     c_++;
//                 }
//             }
//             lastPlus--; // bug2:本来只放在了上面的if里
//             c_++;
//             ans += c_;
//         }
//     }
//     cout << ans;
//     return 0;
// }

// O(1)空间
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int n;
    string s;
    // cin >> n>>s;
    n=5;s="+--++";
    // vector<int> f(n + 1, 0);
    // f[0] = 1;

    int fi=1;
    int ans = 1;

    int c_ = 0; // 减法次数
    int cp = 0; //cp表示加法次数,debug1: 本来没有cp和lastPlus这一套流程跟踪最后一个加法后的值
    int lastPlus = 0; // 最后一个加法后的值
    for (int i = 0; i < s.length(); i++)
    {
        if (s[i] == '+')
        {
            // f[i + 1] = f[i] + 1;
            fi=fi+1;
            // ans += f[i + 1];
            ans+=fi;
            if (c_ == 0)
                cp++;
            else
            {
                cp = 0; // debug3: 本来是1,36%
                c_ = 0;
            }
        }
        else
        {
            // f[i + 1] = 1;
            if (cp > 0)
            {
                // lastPlus = f[i] - 1; // 最后一个加号对应的值-1(可以减多少次)
                lastPlus = fi-1; // 可以减这么多次
                cp = 0;
            }
            else
            {
                if(lastPlus==0)
                {
                    c_++;
                    // lastPlus--; bug2
                }
            }
            fi=1;
            lastPlus--; // bug2:本来只放在了上面的if里
            c_++;
            ans += c_;
        }
    }
    cout << ans;
    return 0;
}
#之江实验室##23秋招##笔试##23届#
全部评论
第二题,从做到右,再从右到左遍历 func main() { var n int for { flag, _ := fmt.Scanln(&n) if flag == 0 { break } var s string fmt.Scanln(&s) count := make([]int, n+1) for i := 0; i <= n; i++ { count[i] = 1 } for i := 0; i < n; i++ { if s[i] == '-&(31563)#39; { count[i] = count[i+1] + 1 } else { count[i+1] = count[i] + 1 } } for i := n; i > 0; i-- { if s[i-1] == '-&#39; && count[i-1] <= count[i] { count[i-1] = count[i] + 1 } else if s[i-1] == '+&(30139)#39; && count[i-1] >= count[i] { count[i] = count[i-1] + 1 } } sum := 0 for i := 0; i <= n; i++ { sum += count[i] } fmt.Println(sum) } }
2 回复 分享
发布于 2022-09-19 12:47 浙江
厉害了,膜拜大佬
点赞 回复 分享
发布于 2022-08-31 09:36 江苏
厉害了大佬,带我飞
点赞 回复 分享
发布于 2022-08-31 09:45 湖北
//   vector<int> d(m+2,0); //   int l,r; //   for(int i=0;i<n;i++){ //     cin>>l>>r; //     d[l]+=1; //     d[r+1]--; //   } 楼主请问,这里35~40多行是什么意思,看不懂C++,可以解释一下原理吗?谢谢楼主!
点赞 回复 分享
发布于 2022-08-31 17:56 广东
同学,另一个题目是啥呢。方便告知一下吗
点赞 回复 分享
发布于 2022-09-03 15:14 陕西
大佬你好,想请问下 第一题 如果是 2 8 1 4 5 8这样的样例不应该是2吗 但按照这个输出是1吗
点赞 回复 分享
发布于 2022-09-14 10:20 浙江
之江笔试可以在本地ide写好再贴上去吗?
点赞 回复 分享
发布于 2022-09-19 01:38 浙江
第一题,合并区间,然后对合并后的结果进行判断 func main() { var n, m int for { flag, _ := fmt.Scanln(&n, &m) if flag == 0 { break } arr := make([][]int, n) for i := 0; i < n; i++ { arr[i] = make([]int, 2) fmt.Scanln(&arr[i][0], &arr[i][1]) } sort.Slice(arr, func(i, j int) bool { return arr[i][0] < arr[j][0] }) res := make([][]int, 0) count := make([]int, n) res = append(res, arr[0]) count[0] = 1 for i := 1; i < n; i++ { if arr[i][0] <= res[len(res)-1][1] { res[len(res)-1][1] = min(res[len(res)-1][1], arr[i][1]) res[len(res)-1][0] = arr[i][0] count[len(res)-1]++ } else { res = append(res, arr[i]) count[len(res)-1]++ } } if len(res) == 1 { if res[0][1]-res[0][0]+1 >= m { fmt.Println(n) } else { fmt.Println(n - 1) } } else if len(res) == 2 && res[0][0] == 1 && res[1][1] == m && res[0][1] + 1 == res[1][0] { fmt.Println(n) } else { sort.Ints(count) fmt.Println(count[n-1]) } } }
点赞 回复 分享
发布于 2022-09-19 12:46 浙江
同学你好,笔试之后多久终面啊?
点赞 回复 分享
发布于 2022-10-20 19:50 山东
糖果屋: 找到糖果最小的下标,然后两边去推每个下标的糖果 package main import "fmt" func main() { n := 0 fmt.Scanln(&n) s := "" fmt.Scanln(&s) cnt := 0 minIdx := 0 minNum := 0 for i := 0; i < n; i++ { if s[i] == '+' { cnt++ } else { cnt-- } if cnt < minNum { minIdx = i minNum = cnt } } fmt.Println(minIdx) ans := 2 cur := 2 if s[minIdx] == '+' { ans = 1 cur = 1 } for i := minIdx; i < n; i++ { if s[i] == '+' { cur++ } else { cur-- } ans += cur } for i := minIdx - 1; i >= 0; i-- { if s[i] == '+' { cur-- } else { cur++ } ans += cur } fmt.Println(ans) } func min(a, b int) int { if a < b { return a } return b } func max(a, b int) int { if a > b { return a } return b }
点赞 回复 分享
发布于 2023-02-15 18:12 广东
第一题差分算法好像有些用例过不了,比如 [1,3], [4, 5], [4,5],如果按照差分算法那么最终回去最大值2,但是1,3分到另一组也可以过
点赞 回复 分享
发布于 2023-02-15 18:22 广东

相关推荐

点赞 评论 收藏
分享
3 17 评论
分享
牛客网
牛客企业服务