9.6 腾讯-技术研究类和数据分析

全A。感觉今天难度倒排

1. 山谷序列,前n个严格递减,后n个严格递增,中间两个数相同,问最长长度。
#include <bits/stdc++.h>
using namespace std;
#define MAXN 10005
#define inf 0x3f3f3f3f
int n, m, T;
int ans;
int a[MAXN], b[MAXN];
int aa[MAXN], bb[MAXN];
int left(int r){
    int c[MAXN];
    int len=0;
    memset(c,inf,sizeof(c));
    for( int i = 1; i <= r; i++){
         int k = lower_bound(c+1, c+r+1, aa[i])-c;
         c[k] = aa[i];
         len = max( len, k );
    }
    return len;
}
int right(int r){
    int c[MAXN];
    int len=0;
    memset(c,inf,sizeof(c));
    for( int i = 1; i <= r; i++){
         int k = lower_bound(c+1, c+r+1, bb[i])-c;
         c[k] = bb[i];
         len = max( len, k );
    }
    return len;
}
int main()
{
    scanf("%d", &T);
    while(T--){
        scanf("%d", &n);
        for(int i = 1 ; i <= n ; i++){
            scanf("%d", &a[i]);
            a[i] *= -1;
            b[n-i+1] = a[i];
        }
        ans = 0;
        for(int i = 1 ; i < n ; i++){
            for(int j = i+1 ; j <= n ; j++){
                if(a[i] != a[j]) continue;
                for(int k = 1 ; k <= n ; k++){
                    aa[k] = a[k];
                    bb[k] = b[k];
                    if(aa[k] > a[i]) aa[k] = a[i];
                    if(bb[k] > a[i]) bb[k] = a[i];
                }
                int l = left(i);
                int r = right(n-j+1);
                ans = max(ans, 2 * min(l, r));
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

2.模拟解方程
#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[10];
double eps = 0.0005;
double f(double x){
    double t = x;
    double ans = a[n];
    for(int i = n-1 ; i >= 0 ; i--){
        ans += t * a[i];
        t *= x;
    }
    return ans;
}
int main()
{
    scanf("%d", &n);
    for(int i = 0 ; i <= n ; i++){
        scanf("%d", &a[i]);
    }
    vector<double> ans;
    for(double i = -5000 ; i < 5000 ; i += eps){
        double p = f(i);
        if( fabs(p) < 1e-8){
            ans.push_back(i);
            continue;
        }
        double q = f(i + eps);
        if(p * q <= 0)
            ans.push_back(i + eps/2);
    }
    if(ans.size() == 0)
        printf("No\n");
    else{
        for(int i = 0 ; i < ans.size() ; i++)
            printf("%.2f ", ans[i]);
        printf("\n");
    }
    return 0;
}

3.概率题:长度L,如果超过d,随机折断,扔掉左边。对右边继续操作。问操作次数期望。
#include <bits/stdc++.h>
using namespace std;
int n, m;
double ans;
int main()
{
    scanf("%d %d", &n, &m);
    if(n <= m)
        ans = 0;
    else{
        ans = log(n) - log(m) + 1;
    }
    printf("%.4f\n", ans);
    return 0;
}

4. 排序
#include <bits/stdc++.h>
using namespace std;
int n, m;
int ans;
struct Node{
    vector<int> nums;
    Node(){}
    bool operator < (const Node a) const{
        for(int i = 0 ; i < 6 ; i++){
            if(nums[i] == a.nums[i]) continue;
            return nums[i] < a.nums[i];
        }
        return true;
    }
}a[100005];
int main()
{
    int T;
    scanf("%d", &T);
    while(T--){
        scanf("%d", &n);
        for(int i = 0 ; i < n ; i++){
            a[i].nums.resize(6);
            for(int j = 0 ; j < 6 ; j++){
                scanf("%d", &a[i].nums[j]);
            }
            sort(a[i].nums.begin(), a[i].nums.end());
        }
        sort(a, a+n);
        bool flag = false;
        for(int i = 0 ; i < n-1 ; i++){
            bool f = true;
            for(int j = 0 ; j < 6 ; j++){
                if(a[i].nums[j] != a[i+1].nums[j]){
                    f = false;
                    break;
                }
            }
            if(f){
                flag = true;
                break;
            }
        }
        if(flag)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

5. 单源最短路
#include <bits/stdc++.h>
using namespace std;
#define MAXN 2005
#define inf 0x3f3f3f3f
int n, m, T;
int ans;
struct edge{
    int to,cost;
};
typedef pair<int,int> P;  //first是最短距离,second是顶点的编号
vector<edge> G[MAXN];
int d[MAXN];
void dijkstra(int s){
    priority_queue<P,vector<P>,greater<P> > que;
    fill(d,d+n,inf);
    d[s] = 0;
    que.push(P(0,s));
    while(!que.empty()){
        P p = que.top();que.pop();
        int v = p.second;
        if(d[v] < p.first) continue;
        for(int i = 0 ; i <G[v].size() ; i++){
            edge e = G[v][i];
            if(d[e.to] > d[v] + e.cost){
                d[e.to] = d[v] + e.cost;
                que.push(P(d[e.to],e.to));
            }
        }
    }
}
int main()
{
    int x, y, w;
    scanf("%d %d %d", &n, &m, &T);
    for(int i = 0 ; i < n ; i++)
        G[i].clear();
    for(int i = 0 ; i < m ; i++){
        scanf("%d %d %d", &x, &y, &w);
        x--;y--;
        G[x].push_back(edge{y, w});
    }
    dijkstra(0);
    ans = d[n-1];
    dijkstra(n-1);
    ans += d[0];
    printf("%d\n", ans*T);
    return 0;
}


#笔试题目##腾讯#
全部评论
tql
点赞 回复 分享
发布于 2020-09-06 22:06
厉害了
点赞 回复 分享
发布于 2020-09-06 22:08
tql,第三题是什么原理
点赞 回复 分享
发布于 2020-09-06 22:09
不错哦。
点赞 回复 分享
发布于 2020-09-06 22:11
给跪了,第三题这解法,我只会一点点算积分...
点赞 回复 分享
发布于 2020-09-06 22:11
***人傻了
点赞 回复 分享
发布于 2020-09-06 22:12
tql,一直卡在第三题
点赞 回复 分享
发布于 2020-09-06 22:12
zyx tql
点赞 回复 分享
发布于 2020-09-06 22:13
求大佬分享思路
点赞 回复 分享
发布于 2020-09-06 22:15
不错哦
点赞 回复 分享
发布于 2020-09-06 22:16
难度倒排+1。做出4道,第三题没想起来,
点赞 回复 分享
发布于 2020-09-06 22:16
太强了
点赞 回复 分享
发布于 2020-09-06 22:16
请问下第三题是什么原理哈
点赞 回复 分享
发布于 2020-09-06 22:21
第三题是2016青岛acm区预赛的c题,题解见:https://blog.csdn.net/GreyBtfly/article/details/80579481?utm_source=blogxgwz6
点赞 回复 分享
发布于 2020-09-06 22:22
tql
点赞 回复 分享
发布于 2020-09-06 22:28
第一题能解释下吗?是找到两个相同的数,然后分别往前,往后找最长升序序列长度吗?
点赞 回复 分享
发布于 2020-09-07 09:06
请问一下楼主.第四题我用的是unordered_map来找是否重复,不知道为什么0case,样例数据自测能过,不知道为什么,代码贴上,请楼主帮忙看下: void solution4(){     int T;     cin>>T;     vector<string> res;     while(T--){         int n;         cin>>n;         unordered_set<string> S;         bool same = false;         while(n--){             vector<int> circle(6);             for(int i=0;i<6;i++){                 char c;                 cin>>c;                 circle[i] = c;             }             sort(circle.begin(),circle.end());             string circle_s;             for(auto &item:circle){                 circle_s += to_string(item);             }             if(S.find(circle_s)!=S.end()){                 same = true;                 res.emplace_back("YES");                 break;             } else                 S.insert(circle_s);         }         if(!same)             res.emplace_back("NO");     }     for(auto &s:res)         cout<<s<<endl; }
点赞 回复 分享
发布于 2020-09-07 11:48
解方程能说说思想吗?还有最后一体我迪杰斯特拉只过了70%,不知道啥情况没考虑到
点赞 回复 分享
发布于 2020-09-07 13:54
第二题解全在[-5000, 5000]之间吗,是试出来的吗,哭了😂
点赞 回复 分享
发布于 2020-09-07 14:22
能分享一下每一题的思路吗,只会python,看不懂
点赞 回复 分享
发布于 2020-09-08 13:37

相关推荐

去B座二楼砸水泥地:不过也可以理解,这种应该没参加过秋招
点赞 评论 收藏
分享
41 128 评论
分享
牛客网
牛客企业服务