测试

第一题

#include 
#include 
#include 
using namespace std;

struct Interval{
	int begin, end, id;
};
bool cmp(const Interval &p1, const Interval &p2){
	return p1.begin<p2.begin;  // 按照开始时间从小到大排序
}
int main()
{
	int n;
	cin >> n;
	Interval time[n+1];
	for (int i = 1; i <= n; ++i)
	{
		cin >> time[i].begin >> time[i].end;
	}
	sort(time+1, time+n+1, cmp);
    priority_queue<int> q; // 用优先队列记录每个教室最后结束时间
    // 注意优先队列默认为大顶堆,即队首元素值最大,我们为了找出最小的结束时间,直接取负即可
    for (int i = 1; i <= n; ++i)
    {
    	if(q.empty() || -q.top()>time[i].begin)
    	{
    		q.push(-time[i].end);  // 新建一个教室
    	}
    	else
    	{
    		q.pop();
    		q.push(-time[i].end);
    	}
    }
    cout << q.size() << endl; // 输出教室个数
	return 0;
}

第二题

from queue import PriorityQueue
n = int(input())
intervals = []
for i in range(n):
    line = input().split()
    a, b = int(line[0]), int(line[1])
    intervals.append([a, b])

intervals = sorted(intervals, key=lambda item: item[0])
q = PriorityQueue()
for i in range(n):
    if q.empty():
        q.put(-intervals[i][1])
    else:
        top = q.get()
        if -top > intervals[i][0]:
            q.put(-top)
            q.put(-intervals[i][1])
        else:
            q.put(-intervals[i][1])
print(q.qsize())



第三题

//
// Created by zhao on 2020/8/1.
//

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long LL;
const int maxn=100000+5;

//tot[i]代表以i为根,i被选中,连起来能获得的最大值
int n,fa[maxn],v[maxn],root;
LL ans,tot[maxn];
vector<int> tree[maxn];

//返回tot[node]的值,也就是以i为根的子树,i被选中的情况下,向下延伸若干连续节点 构建的最大奖励
LL dfs(int node){
    LL &temp=tot[node];
    temp=v[node];
    for(int i=0;i<tree[node].size();++i){
        int son=tree[node][i];
        temp+=max(0LL,dfs(son));  //子树可以选择,也可以不选
    }
    return temp;
}

int main(void){
    scanf("%d",&n);
    for(int i=1;i<=n;++i){
        scanf("%d%d",&v[i],&fa[i]);
        if(fa[i]==0) root=i;
        else{
            fa[i]--;  //从1开始数
            tree[fa[i]].push_back(i);  //构造树
        }
    }
    ans=dfs(root); //dfs
    printf("%lld\n",ans);
}
//3
//2 0
//1 2
//-1 2

你可能感兴趣的:(数字通信)