【noip模拟赛3】确定的位置 (map的遍历 位置原理)

描述

 

hzy很喜欢了解歌曲的排行榜,他每次都从XX网站获知。

由于这个网站想对这个歌曲的排行榜含蓄的告诉大家,组织了一个“猜榜大赛”。

这个网站宣布一些歌曲的信息,那些歌曲在歌曲榜上的前几名

例如:

·"qianlizhiwai" 是在榜上的前三名

·"qianlizhiwai","dachengxiaoai" 是在歌曲榜的前两名

网站不会把歌曲的名次十分明确的告诉你,他就是想让你通过这些信息,推出一部分歌曲的名次,现在困惑的hzy找您帮忙,想让您推出所有确定名次的歌曲。

输入

 

第一行包括一个整数n, 1≤n≤500,表示网站给你的信息的条数。

下面n行包括一条信息,形式为"A and B song1 song2 song3 ... songA",1≤A≤B≤100,表示"song1","song2",...,"songA"是在歌曲榜的前B位。

每一首歌都是一个string,由最多25个小写字母组成。

输出

 

输出可以知道的所有的歌的排名,形式:"Position Song"位置必须有序。

输入样例 1 

2
1 and 3 lonely
2 and 2 trebami jasekonja

输出样例 1

3 lonely

输入样例 2 

3 
2 and 2 pjesma1 pjesma2
3 and 4 pjesma1 pjesma3 pjesma4
1 and 3 pjesma4 

输出样例 2

3 pjesma4
4 pjesma3


没有思路的题 参考了队里大佬的做法:

先用map取每个人最靠前的名次(显然 如果某个人被限定到更前面的名次 那么其后面的名次没有意义)
然后 遍历map 将名次相同的push进一个vector
mp里的first为【】里的 second为右边的


最后从一 开始遍历所有名次
如果当前上榜歌曲总数等于排名且当前排名的歌曲唯一 那么它的排名就可以确定!
#include<bits/stdc++.h>
using namespace std;
//input
#define rep(i,x,y) for(int i=(x);i<=(y);++i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m);
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s)
#define LL long long
#define REP(i,N)  for(int i=0;i<(N);i++)
#define CLR(A,v)  memset(A,v,sizeof A)
//////////////////////////////////
#define N 2050
#define inf -0x3f3f3f3f
map<string,int>mp;vector<string>v[105];
int n,tot;
int main()
{
    RI(n);
    rep(i,1,n)
    {
        int a,b;string str;
        RI(a);
        cin>>str;
        RI(b);
        while(a--)
        {
            cin>>str;
            if(!mp.count(str))mp[str]=b;
            else mp[str]=min(mp[str],b );
        }
    }
    map<string,int>::iterator it;
    for(it=mp.begin();it!=mp.end();it++)
        v[it->second].push_back(it->first);
        
    tot=0;
    rep(i,1,100)
    {
        tot+=v[i].size();
        if(v[i].size()==1&&tot==i)
            cout<<i<<" "<<v[i][0]<<endl;
    }
}















猜你喜欢

转载自www.cnblogs.com/bxd123/p/10502712.html
今日推荐