Educational Codeforces Round 114 (Rated for Div. 2) D The Strongest Build(map+vector)

阅读: 评论:0

Educational Codeforces Round 114 (Rated for Div. 2) D The Strongest Build(map+vector)

Educational Codeforces Round 114 (Rated for Div. 2) D The Strongest Build(map+vector)

题目大意:
给你n行数字
每组数字按递增顺序给出
再给你m个禁止的序列
就是你不能按这些序列来选这n行的数字
问你除了禁止序列的顺序外每行选一个数字的最大值

思路:
map+vector
感觉就是考察stl运用吧…
我们可以首先每行都选最后一个数字即最大的数字
然后如果这个是被禁止的
那么我们就遍历所有禁止的数组
枚举每行的前一个数字去选
如果这个枚举的序列是被禁止的那到后面会再过来遍历这个序列
这样就保证了一定会遍历到最优解
怎么看被禁止的话我们就可以用map[vector]去看这个数组是不是被禁止的
剩下的基本是stl运用了吧
时间复杂度应该是1e5*10
每个位置往前枚举一次,最多有10个位置

AC代码:

#include <bits/stdc++.h>using namespace std;
map<vector<int>,int>mp;
vector<int>h;
int main()
{ios::sync_with_stdio(false),cin.tie(0);int n;cin>>n;vector<vector<int>>a(n);for(int i=0; i<n; i++){int c;cin>>c;a[i].resize(c);//开长度为c的数组for(int j=0; j<c; j++)cin>>a[i][j];h.push_back(c-1);}int m;cin>>m;for(int i=0; i<m; i++){vector<int>H;for(int j=0; j<n; j++){int x;cin>>x;H.push_back(x-1);}mp[H]=1;}int ans=0,cnt=0;if(mp[h]){for(auto temp:mp){cnt=0;vector<int>v=temp.first;for(int i=0; i<n; i++)cnt+=a[i][v[i]];if(cnt<=ans)continue;for(int i=0; i<n; i++){if(v[i]){v[i]--;if(!mp[v]){int tot=cnt+a[i][v[i]]-a[i][v[i]+1];if(tot>ans){ans=tot;h=v;}}v[i]++;}}}}for(int i=0; i<n; i++)cout<<h[i]+1<<' ';cout<<endl;return 0;
}

本文发布于:2024-02-03 00:13:09,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170689038847386.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:Rated   Educational   Codeforces   Div   map
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23