1. 程式人生 > 實用技巧 >2018 ACM ICPC Asia Regional - Seoul B.Cosmetic Survey

2018 ACM ICPC Asia Regional - Seoul B.Cosmetic Survey

題意:

n種化妝品,m個顧客,每個顧客對每款化妝品有一個非負的評級。評級越小表示越喜歡。若評級為零,表示最討厭。

d(x,y)表示在化妝品x和y中,更喜歡x的人數

對於一個序列C1,C2,……Ck,其中d(C_i,C_i+1)>d(C_i+1,C_i)定義偏愛程度為最小的d(C_i,C_i+1)

S(x,y)表示所有以x為開頭,以y為結尾的序列中,偏愛程度最大值

若一個化妝品x滿足S(x,y)>=S(y,x)對於所有的y(y!=x)都成立,則該化妝品是最好的

求出所有的最好的化妝品

暴力求出所有的d,若d(i,j)>d(j,i),i向j連一條權值為d(i,j)的 邊

s(x,y)為所有從x到y的路徑最小值的最大值

floyd更新,s(x,y)=max[ s(x,y),min(s(x,k),s(k,y)) ]

#include<cstdio>
#include<algorithm>

using namespace std;

#define N 501

int a[N];
int d[N][N]; 

int ans[N];        

int main()
{
    int n,m,x;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;++i)
    {
        
for(int j=1;j<=n;++j) { scanf("%d",&a[j]); if(!a[j]) a[j]=1e7; } for(int j=1;j<n;++j) for(int k=j+1;k<=n;++k) if(a[j]<a[k]) d[j][k]++; else if(a[k]<a[j]) d[k][j]++; }
for(int i=1;i<n;++i) for(int j=i+1;j<=n;++j) if(d[i][j]<d[j][i]) d[i][j]=0; else if(d[i][j]>d[j][i]) d[j][i]=0; else d[i][j]=d[j][i]=0; for(int k=1;k<=n;++k) for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) d[i][j]=max(d[i][j],min(d[i][k],d[k][j])); /*for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j) printf("%d ",d[i][j]); printf("\n"); }*/ bool tag; x=0; for(int i=1;i<=n;++i) { tag=true; for(int j=1;j<=n && tag;++j) { if(i==j) continue; if(d[i][j]<d[j][i]) tag=false; } if(tag) ans[++x]=i; } sort(ans+1,ans+x+1); for(int i=1;i<=x;++i) printf("%d ",ans[i]); }