• 找礼物(find)(模拟)


    找礼物(find)

    时间限制: 1 Sec  内存限制: 64 MB
    提交: 57  解决: 4
    [提交][状态][讨论版]

    题目描述

    新 年到了,你的好友和你(共K个人)的周围满是礼物,你让你的好友先拿,但是每个人只能拿当前离自己最近的礼物[当然如果有并列的多个礼物离你的距离相等 (精确到小数点后四位,所有运算均为去尾),这些礼物就都属于这个人]。现在你们所在的位置是原点(0,0),每个礼物的位置用坐标表示。现在告诉你每个 礼物的坐标,还有每个礼物是谁送的。要你找出你的礼物离你多远,你能拿到多少礼物,这些礼物是谁送的。如果你拿不到礼物,请输出“555…”。

    输入

    第1行:N和K分别表示礼物的个数和人数(K≤N≤100000);
    第2到N+1行:每行先是赠送礼品人的姓名,然后是礼物的坐标(x,y)(坐标绝对值小于106)。数据间用空格分开。

    输出

    第1行:D和U表示礼物距你多远(只要去尾后的整数)和你能拿到多少礼物。
    第2到U+1行:每行一个人名,表示送礼的人(按照输入的顺序输出)。

    样例输入

    5 2
    Jason 1 1
    Herry 4 4
    Patty 3 4
    Tom 2 10
    Petter 5 10
    

    样例输出

    5 1
    Patty
    
    【分析】太坑了,太坑了,太坑了,重要的事情说三遍。一开始用double存距离,WA了好几发,然后听了一个大神的劝告,乖乖的用上long long。下面是AC代码。
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <time.h>
    #include <string>
    #include <map>
    #include <stack>
    #include <vector>
    #include <set>
    #include <queue>
    #define inf 0x3f3f3f3f
    #define mod 1000000007
    typedef long long ll;
    using namespace std;
    const int N=100010;
    int k,n,m;
    queue<string>q;
    struct man
    {
        ll s;
        string name;
    };man a[N],w[N];
    bool cmp(man g,man h)
    {
        return g.s<h.s;
    }
    int main () {
         cin>>n>>k;
         string l;
        for(int i=0;i<n;i++)
        {
            ll aa,b;
            cin>>l>>aa>>b;
            a[i].s=(ll)(sqrt(aa*aa+b*b+0.0)*10000ll);
            a[i].name=l;
            w[i].s=a[i].s;w[i].name=l;
        }
        sort(a,a+n,cmp);
        ll t=a[0].s;
        int j=0,i;
        k=k-1;
        while(k--)
        {
            for( i=j;i<n;i++)
            {
                if(a[i].s==t)continue;
                else {
                    j=i;
                    t=a[i].s;
                    break;
                }
            }
             j=i;
                    t=a[i].s;
        }
    
        if(j>=n){printf("555...
    ");exit(0);}
        int ans=0;
        for( i=0;i<n;i++)
            {
                if(w[i].s==t){ans++;q.push(w[i].name);continue;}
    
            }
            ll dd=a[j].s;
                   cout<<dd/10000<<" "<<ans<<endl;
            while(!q.empty())
            {
                string ss=q.front();q.pop();cout<<ss<<endl;
            }
         return 0;
    }
    View Code
  • 相关阅读:
    数据库秒级平滑扩容架构方案
    利用SQL索引提高查询速度
    SQL Server调优系列进阶篇(如何维护数据库索引)
    SQL Server调优系列进阶篇(如何索引调优)
    SQL语法集锦一:显示每个类别最新更新的数据
    TreeView中节点勾选设置
    C# WinForm捕获全局异常
    SQL SERVER 查询死锁
    DataTable导入到Excel文件
    Microsoft SyncToy 文件同步工具
  • 原文地址:https://www.cnblogs.com/jianrenfang/p/5722784.html
Copyright © 2020-2023  润新知