NC54605. 盖楼大挑战
描述
输入描述
第一行输入三个数n, m, K, n为icpc集训队人数, m为总的助力请求数(请求的时间顺序即为输入顺序),K为助力限制数第二行输入n个数,第i个数表示第i个人的楼层等级第三行输入n个数,第i个数表示第i个人的队伍编号接下来m行每行两个数x, y表示编号为x的人向编号为y的人请求助力
输出描述
一行n个数,第i个数表示第i个人所在队伍的等级
示例1
输入:
5 0 1 32 342 123 1 32 1 2 3 2 1
输出:
64 343 123 343 64
示例2
输入:
5 4 2 1 2 3 4 5 1 1 2 2 3 2 5 1 5 3 5 3 4
输出:
8 8 12 12 5
示例3
输入:
3 3 1 1 2 3 1 2 3 1 2 1 3 2 3
输出:
6 2 3
C++11(clang++ 3.9) 解法, 执行用时: 3ms, 内存消耗: 744K, 提交时间: 2019-11-22 20:10:17
#include<bits/stdc++.h> using namespace std; const int MAXN=1000+50; int a[MAXN],b[MAXN],s[MAXN],jl[MAXN],hel[MAXN][MAXN]; int main(){ int n,m,k; cin>>n>>m>>k; for(int i=1;i<=n;i++) jl[i]=k; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=n;i++){ cin>>b[i]; s[b[i]]+=a[i]; } for(int i=1;i<=m;i++){ int x,y; cin>>x>>y; if(jl[y]&&!hel[y][b[x]]&&b[x]!=b[y]){ s[b[x]]+=a[y]; jl[y]--; hel[y][b[x]]=1; } } for(int i=1;i<=n;i++){ cout<<s[b[i]]<<" "; } cout<<endl; return 0; }
Python3(3.5.2) 解法, 执行用时: 49ms, 内存消耗: 3448K, 提交时间: 2019-11-22 20:44:04
n, m, K = map(int, input().split()) a = list(map(int, input().split())) t = list(map(int, input().split())) mark = [[] for _ in range(n)] s = [0 for _ in range(max(t))] for i in range(n): s[t[i] - 1] += a[i] for i in range(m): x, y = map(int, input().split()) if not(t[x - 1] in mark[y - 1] or len(mark[y - 1]) >= K or t[x - 1] == t[y - 1]): s[t[x - 1] - 1] += a[y - 1] mark[y - 1].append(t[x - 1]) for i in range(n): print(s[t[i] - 1], end=' ')