zoukankan      html  css  js  c++  java
  • pta l2-28(秀恩爱分得快)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805054698012672

    题意:给n个人,m张照片,在同一张照片中的异性亲密值增加1/size(size为该照片中的人数),给出一对情侣,若两人是彼此亲密值最高的异性,则输出两人(忽视并列的),否则分别输出与两人亲密值最高的异性(若有并列按绝对值升序输出)。

    思路:首先需要指出的坑在于对0与-0的处理,这就决定了输入只能用字符串输入,同理输出也是。思路大体是对每张照片中的人用set数组保存,输入情侣a,b之后,通过count函数查找set[i]中是否有a/b,有的时候就处理,因为在并列时要按升序输出,我们可以用桶来保存a/b与其他人的亲密值,输出时从0到n-1遍历即可。

    AC代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int maxn=1005;
     5 int n,m,k,sex[maxn];
     6 double maxa,maxb,pa[maxn],pb[maxn];
     7 set<int> st[maxn];
     8 
     9 int geti(char* s){
    10     int ans;
    11     if(s[0]=='-')
    12         ans=atoi(s+1),sex[ans]=1;
    13     else
    14         ans=atoi(s);
    15     return ans;
    16 }
    17 
    18 bool check(double x,double y){
    19     if(abs(x-y)<0.0000001)
    20         return true;
    21     return false;
    22 }
    23 
    24 void print(int x,int y){
    25     if(sex[x]==1) printf("-");
    26     printf("%d ",x);
    27     if(sex[y]==1) printf("-");
    28     printf("%d
    ",y);
    29 }
    30 
    31 int main(){
    32     scanf("%d%d",&n,&m);
    33     for(int i=0;i<m;++i){
    34         scanf("%d",&k);
    35         for(int j=0;j<k;++j){
    36             int t;
    37             char tmp[5];
    38             scanf("%s",tmp);
    39             t=geti(tmp);
    40             st[i].insert(t);
    41         }
    42     }
    43     int a,b;
    44     char tmp1[5],tmp2[5];
    45     scanf("%s%s",tmp1,tmp2);
    46     a=geti(tmp1),b=geti(tmp2);
    47     for(int i=0;i<m;++i){
    48         int sz=st[i].size();
    49         if(st[i].count(a))
    50             for(set<int>::iterator it=st[i].begin();it!=st[i].end();++it)
    51                 if(*it!=a&&sex[a]!=sex[*it]){
    52                     pa[*it]+=1.0/sz;
    53                     if(maxa<pa[*it]) maxa=pa[*it];
    54                 }
    55         if(st[i].count(b))
    56             for(set<int>::iterator it=st[i].begin();it!=st[i].end();++it)
    57                 if(*it!=b&&sex[b]!=sex[*it]){
    58                     pb[*it]+=1.0/sz;
    59                     if(maxb<pb[*it]) maxb=pb[*it];
    60                 }
    61     }
    62     if(maxa==pa[b]&&maxb==pb[a])
    63         print(a,b);
    64     else{
    65         for(int i=0;i<n;++i)
    66             if(check(maxa,pa[i]))
    67                 print(a,i);
    68         for(int i=0;i<n;++i)
    69             if(check(maxb,pb[i]))
    70                 print(b,i);
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    3月21日软件工程概论课堂测验
    四则运算2
    构建之法阅读笔记01
    软件工程学习进度条02-06
    软件工程个人作业01
    简牍《构建之法》
    2月29日课后作业
    读《大道至简》第七八章有感
    个人冲刺——第十天
    人月神话阅读笔记02
  • 原文地址:https://www.cnblogs.com/FrankChen831X/p/10596880.html
Copyright © 2011-2022 走看看