• 【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;
        }
    }















  • 相关阅读:
    Ignoring HTTPS certificates
    利用Httponly提升web应用程序安全性
    HttpUrlConnection java.net.SocketException: Software caused connection abort: recv failed
    DISPOSE_ON_CLOSE 和 EXIT_ON_CLOSE 的区别
    Swing多线程
    攒机知识积累
    数组最大子数组和
    fork()详解
    理解Socket编程【转载】
    STM32F407_LED代码
  • 原文地址:https://www.cnblogs.com/bxd123/p/10502712.html
Copyright © 2020-2023  润新知