L2-028 秀恩爱分得快

我看到网上有很多做法,什么-0转-1000的。

但是我觉得完全可以开一个数组去记录这些东西的±就行了。

所以采用了以下的极度简单的做法

  1. 使用一个st数组记录他的性别

  1. come数组记录他是否出现过(这个不知道是不是必须的,没有去尝试)

  1. node二维记录两个点之间的亲密度,一开始想复杂了,使用了结构体,可以直接改成double数组

思路

  1. 先录入各种信息填补以上的数组

  1. 然后先寻找两者最大的节点编号,比较是否互相都是最大的,如果不是则执行第3步,如果是就输出就行

  1. 先按编号从小到大寻找最大亲密值的编号就行。

#include<iostream>
#include<vector>
using namespace std;

int const N=1e3+10;
int n,m,k,x,y;
bool st[N];
bool come[N];//这个判断是否来过,别没有的也上了
struct Node{
    double x=0;
}node[N][N];
//是这样想的,node可以排序,然后肯定要存异性的东西的
//然后升序排序
int main(){
//第1步
    cin>>n>>m;
    while(m--){
        cin>>k;
        vector<int> v1,v2;
        for(int i=0;i<k;i++){
            string t1;
            cin>>t1;
            int t=stoi(t1);
            if(t1.find("-")!=0){
                st[abs(t)]=true;
                v1.push_back(t);
            }
            else{
                v2.push_back(t);
            }
            come[abs(t)]=true;
        }
        for(int i=0;i<v1.size();i++){
            for(int j=0;j<v2.size();j++){
                int a=v1[i],b=v2[j];
                node[abs(a)][abs(b)].x+=(double)1/k,node[abs(b)][abs(a)].x+=(double)1/k;
            }
        }
        
    }
    cin>>x>>y;
    int absx=abs(x);
    int absy=abs(y);
    double maxx=0,maxy=0,xi=0,yi=0;
//第2步
    for(int i=0;i<n;i++){
        bool fy=st[absy]*!st[i]+!st[absy]*st[i];
        bool fx=st[absx]*!st[i]+!st[absx]*st[i];
        if(fx)
        if(maxx<=node[abs(x)][i].x)
            maxx=node[abs(x)][i].x,xi=i;
        if(fy)
        if(maxy<=node[abs(y)][i].x)
            maxy=node[abs(y)][i].x,yi=i;
    }
//第3步
    if(xi==absy&&yi==absx){
                string c1=to_string(absx);
                string c2=to_string(absy);
                if(!st[absx])c1='-'+to_string(absx);
                if(!st[absy])c2='-'+to_string(absy);
        cout<<c1<<" "<<c2<<endl;
    }
    else{
        for(int i=0;i<n;i++){
        bool fx=st[absx]*!st[i]+!st[absx]*st[i];
            if(fx&&node[abs(x)][i].x==maxx&&come[i]){
                string c1=to_string(absx);
                string c2=to_string(i);
                if(!st[absx])c1='-'+to_string(absx);
                if(!st[i])c2='-'+to_string(i);
                cout<<c1<<" "<<c2<<endl;
            }
            
        }
        for(int i=0;i<n;i++){
        bool fy=st[absy]*!st[i]+!st[absy]*st[i];
            if(fy&&node[absy][i].x==maxy&&come[i]){
                string c1=to_string(absy);
                string c2=to_string(i);
                if(!st[absy])c1='-'+to_string(absy);
                if(!st[i])c2='-'+to_string(i);
                cout<<c1<<" "<<c2<<endl;
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值