阿里国际笔试

  • 两个数相加为偶数,只可能偶+偶/奇+奇,维护当前的奇偶数量,枚举当前数,特判前一个数即可

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 10;
int a[N];
signed main()
{
    int n,ans=0;
    cin >> n;
    for (int i = 1;i<=n;i++)
        cin >> a[i];
    int odd = 0, even = 0;
    for (int i = 1; i <= n;i++){
        if(a[i]&1){
            ans += odd;
            if(i>=2&&a[i-1]%2!=0)
                ans--;
        }else{
            ans += even;
            if(i>=2&&a[i-1]%2==0)
                ans--;
        }
		odd+=(a[i]&1);
		even+=(a[i]%2==0);
    }
    cout << ans;
}

  • 当n为偶数时,所有格子都可以染色,不会冲突,连成环只有两种情况,红黄红黄... 当为奇数时,有一个格子不能染色,先用前缀和维护两种情况的总和,红黄红黄红黄,以及黄红黄红黄红,枚举不能染色的格子,答案为前面的一种情况+后面的一种情况解决冲突,取max即可

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int a[N], b[N], s1[N], s2[N];
int main()
{
    int n, ans = 0;
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i] >> b[i];
    if (n & 1)
    {
        for (int i = 1; i <= n; i++)
        {
            s1[i] += s1[i - 1] + (i & 1 ? a[i] : b[i]);
            s2[i] += s2[i - 1] + (i & 1 ? b[i] : a[i]);
        }

        for (int i = 1; i <= n; i++)
        {
            ans = max(ans, s1[i - 1] + s2[n] - s2[i]);
            ans = max(ans, s2[i - 1] + s1[n] - s1[i]);
        }

        cout << ans << endl;
    }
    else
    {
        int res = 0;
        for (int i = 1; i <= n; i++)
        {
            if (i & 1)
                res += a[i];
            else
                res += b[i];
        }
        int ans = res;
        res = 0;
        for (int i = 1; i <= n; i++)
        {
            if (i & 1)
                res += b[i];
            else
                res += a[i];
        }
        ans = max(ans, res);
        cout << ans << endl;
    }
}

  • 首先dfs算出每个子树的size,枚举每个节点,计算出max-min即可
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
vector<int> g[N];
int sz[N], ans = 0;
int dfs(int x, int fa)
{
    sz[x] = 1;
    for (auto v : g[x])
    {
        if (v == fa)
            continue;
        dfs(v, x);
        sz[x] += sz[v];
    }
    int m1 = 0, m2 = 1e9;
    for (auto v : g[x])
    {
		if(v==fa) continue;
        m1 = max(m1, sz[v]);
        m2 = min(m2, sz[v]);
    }
	if(m2!=1e9)// 存在极值
    	ans += m1 - m2;
	return sz[x];
}
int main()
{
    int n;
    cin >> n;
    for (int i = 1; i < n; i++)
    {
        int u, v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    dfs(1, -1);
    cout << ans;
}

全部评论
大佬,T3为什么是u->v存完还要存v->u,只存一个可以嘛?我的想法和你一样求子树size,然后更新max,min,最后求极值,dfs返回的结果就是max+1
点赞 回复
分享
发布于 04-15 23:15 广东
你它M的虾皮笔试呢?
点赞 回复
分享
发布于 04-16 10:01 广东
滴滴
校招火热招聘中
官网直投
可以帮我看一下我第一题的代码问题在哪吗,我卡在16.67不动了 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 int n = in.nextInt(); int mat[] = new int[n]; for(int i = 0;i < n;i++){ mat[i] = in.nextInt(); } if(n <= 2) System.out.print(0); else{ int ans = 0; int ou = 0; int ji = 0; for(int i = 2;i < n;i++){ if(mat[i-2] % 2 == 0) ou++; else if(mat[i-2] % 2 == 1) ji++; if(mat[i] % 2 == 0) ans += ou; else if(mat[i] % 2 == 1) ans += ji; } System.out.print(ans); } } }
点赞 回复
分享
发布于 04-16 13:32 北京

相关推荐

4 20 评论
分享
牛客网
牛客企业服务