腾讯3.31笔试,第一次ak纪念一下hh

//第一题 所有边都为红色

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;

int main() {
  int n, m, a, b;
  char ch;
  cin >> n >> m;

vector<vector<pii>>g(n + 1);
for (int i = 0; i < m; i++) {
    cin >> a >> b >> ch;
    if (ch == 'W') {
        g[a].push_back({b, 0});
        g[b].push_back({a, 0});
    } else {
        g[a].push_back({b, 1});
        g[b].push_back({a, 1});
    }
}

int c = 0, s;
for (int j = 1; j <= n; j++) {
    s = 0;
    for (auto [x, y] : g[j])s += y;

    if (s == g[j].size())c++;
}
cout << c << endl;
}

//第二题 可翻转一次变成升序的链表/**

class Solution {
public:
/*代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可@param lists ListNode类vector@return bool布尔型vector
*/

vector<bool> canSorted(vector<ListNode>& lists) {
// write code here
vector<bool>r;
for (ListNode* l : lists)r.push_back(f(l));
return r;
}
bool f(ListNode* node) {
  int x = 0;
  ListNode* p = node, *q = node->next;
  while (q) {if (p->val > q->val)x++;
  p = q;
  q = q->next;
   }
  
  if (x == 0)return true;
  else if (x == 1 && p->val < node->val)return true;
  return false;
 }
};

//第三题 加一条边使得图联通的方案数

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
vector<int>p;
int s;
int find(int x) {
  if (p[x] != x)p[x] = find(p[x]);
  return p[x];
}
void uite(int x, int y) {
  int px = find(x), py = find(y);
  if (px == py)return;
  else {
    p[px] = py;
    s--;}
}
int main() {int n, m;cin >> n >> m;
s = n;
p.resize(n);
iota(p.begin(), p.end(), 0);

int a, v;

for (int i = 0; i < m; i++) {
    cin >> a >> v;
    uite(a - 1, v - 1);
}

if (s != 2) {
    cout << 0 << endl;
    return 0;
}

vector<int>r;
for (int i = 0; i < n; i++)r.push_back(find(i));

int mi = *min_element(r.begin(), r.end());

long long c = 0;

for (int i : r) {

    if (i == mi)c++;

}
cout <<c*(n - c) << endl;
}// 64 位输出请用 printf("%lld")

//第四题 将数组分为k段 每段结果的最大和

#include <iostream>
#include<bits/stdc++.h>
#include <vector>
using namespace std;
int main() {int n, k;cin >> n >> k;

int a;
vector<long long>pre(n + 1);
for (int i = 0; i < n; i++) {
    cin >> a;
    pre[i + 1] = pre[i] ^ a;
}

//dp[i][k]代表截至i位置分为k段的最大和

vector<vector<long long>>dp(n, vector<long long>(k + 1, 0L));

for (int i = 0; i < n; i++) {
    dp[i][1] = pre[i + 1];
    dp[i][0] = INT_MIN;
}



for (int i = 0; i < n; i++) {
    for (int j = 0; j <= i; j++) {
        for (int s = 1; s <= k; s++) {
            dp[i][s] = max(dp[i][s], dp[j][s - 1] + (pre[i + 1] ^ pre[j + 1]));
        }

    }
}
cout << dp[n - 1][k];
}// 64 位输出请用 printf("%lld")

//第五题 搜索字符串 "tencent" 的方案个数

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main() {
  int n, m;
  cin >> n >> m;
  string t = "tencent";
  vector<string>g(n);string s;
  for (int i = 0; i < n; i++) {cin >> s;g[i] = s;}

int ans = 0;

vector<int>dir = {1, 0, -1, 0, 1};
function<void(int, int, int)>dfs = [&](int i, int j, int step) {
    if (step == 6) {
        ans++;
        return;
    }
    for (int k = 0; k < 4; k++) {
        int ni = i + dir[k], nj = j + dir[k + 1];
        if (ni < 0 || ni >= n || nj < 0 || nj >= m || g[ni][nj] != t[step + 1])continue;
        dfs(ni, nj, step + 1);
    }
};

for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
        if (g[i][j] == 't')dfs(i, j, 0);
    }

cout<<ans<<endl;
}// 64 位输出请用 printf("%lld")

#笔试#
全部评论
All Kill! 蹲后续
3 回复 分享
发布于 03-31 22:45 黑龙江
大佬过了吗
1 回复 分享
发布于 04-01 17:12 广东
最后一个以为不能重复使用.加了个visited
点赞 回复 分享
发布于 03-31 22:50 湖北
记录每个节点的总边数,并记录每个节点的R边数。如果该节点的总边数等于R边数就是好点,为什么这样过不了呢
点赞 回复 分享
发布于 03-31 22:51 江西
第五题这样搜为啥不会超时
点赞 回复 分享
发布于 04-01 10:09 广东

相关推荐

周述安:这都能聊这么多。别人要是骂我,我就会说你怎么骂人?他要是继续骂我,我就把评论删了。
点赞 评论 收藏
分享
想润的芹菜人狠话不多:把其中一个老总放中间都会得罪另一个
点赞 评论 收藏
分享
吃辣椒还买票:没有一个公司不加班的,不加班的公司哪有收益给你开工资啊
点赞 评论 收藏
分享
10 16 评论
分享
牛客网
牛客企业服务