UVALive-7222 National Disaster【思维+排序+模拟】

来源:互联网 发布:河南胸模招聘淘宝 编辑:程序博客网 时间:2024/05/21 14:49


题目大意:

给你N个点的坐标,两个人互相能够看到的限制是两个人处于的位子的距离小于等于p.此时给你一个01矩阵,表示报告上写的内容,其中Aij如果是1的话,表示i能够看到j.

现在已知报告会有一部分错误,让你找到一个值p,使得错误最少。如果p有多解,输出最小值。


思路:


最多一共有200个点,那么一共就有40000种距离,我们不妨将其按照从小到大排序,那么初始的时候如果我们选定p==0.那么结果矩阵就是全0的.

那么此时作为初始结果矩阵,我们每一次将一种距离放置矩阵中,使得这个位子从0变成1.

过程维护一下最小值即可。


Ac代码:


#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>using namespace std;#define ll long long intstruct node{    ll x,y,diss;}b[500*500];ll x[5000];ll y[5000];ll dis[500][500];ll temp[500][500];ll a[500][500];ll n,sum,cnt;int cmp(node a,node b){    return a.diss<b.diss;}void init(){    cnt=0;    for(ll i=0;i<n;i++)    {        for(ll j=0;j<n;j++)        {            dis[i][j]=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);            b[cnt].x=i;            b[cnt].y=j;            b[cnt].diss=dis[i][j];            cnt++;        }    }}int main(){    ll t;    ll kase=0;    scanf("%lld",&t);    while(t--)    {        scanf("%lld",&n);        memset(temp,0,sizeof(temp));        for(ll i=0;i<n;i++)scanf("%lld",&x[i]);        for(ll i=0;i<n;i++)scanf("%lld",&y[i]);        for(ll i=0;i<n;i++)        {            for(ll j=0;j<n;j++)            {                scanf("%lld",&a[i][j]);            }        }        init();        sort(b,b+cnt,cmp);        ll output,output2;        ll sum=0;        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)            {                if(temp[i][j]!=a[i][j])sum++;            }        }        output2=sum,output=0;        for(int i=0;i<cnt;i++)        {            temp[b[i].x][b[i].y]=1;            if(a[b[i].x][b[i].y]==1)            {                sum--;            }            else            {                sum++;            }            if(i+1==cnt||b[i].diss!=b[i+1].diss)            {                if(sum<output2)                {                    output2=sum;                    output=b[i].diss;                }                if(sum==output2)                {                    output2=sum;                    output=min(output,b[i].diss);                }            }        }        printf("Case #%lld: ",++kase);        printf("%lld %lld\n",output,output2);    }}





0 0
原创粉丝点击