HMTD @ 2017-10-31 15:29:33
因为只要停靠了一个车站x,辣么比他优先级高的车站都要停靠
so,每一组车次信息中,停靠的那些站一定比没有停靠的级别高
所以开一个bool矩阵(axiaob),axiaob[i][j]=true代表i站比j优先级低
每次读入车次信息,都经过(瞎)分析后填入矩阵。
坠后江每一行矩阵true的个数进行加和,因为true的越多证明它比越多的站低级。
也就是它越低级。
然后我们统计一下一共加出来了几种(注意不是几个)和。
输出,骗到70。
↓下面是代码↓
#include<bits/stdc++.h>
using namespace std;
inline int readd()
{
int ans=0;
char a;
bool fu=false;
while(a=getchar(),a<'0'||a>'9')
if(a=='-')
fu=true;
do
{
ans=ans*10+int(a-'0');
}while(a=getchar(),a>='0'&&a<='9');
if(fu)
return -ans;
else
return ans;
}//快读
bool axiaob[1001][1001];
bool roadd[1001];
int ord[1001];
int tj[1001];
int main()
{
//freopen("level.in","r",stdin);
//freopen("level.out","w",stdout);
int n,m;
cin>>n>>m;
int stop;int num;
int l=10000,r=0;
for(int i=1;i<=m;i++)
{
l=10000,r=0;
cin>>num;
for(int j=1;j<=num;j++)
{
cin>>stop;
roadd[stop]=true;
if(stop<l)
l=stop;
if(stop>r)
r=stop;
}
for(int j=l;j<=r;j++)
{
if(roadd[j])
for(int k=l;k<=r;k++)
if(!roadd[k])
axiaob[k][j]=true;
}
memset(roadd,0,sizeof(roadd));
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(axiaob[i][j])
ord[i]++;
int pin=1;
int total=0;
memset(tj,-1,sizeof(tj));
for(int i=1;i<=n;i++)
{
for(int j=1;j<pin;j++)
if(tj[j]==ord[i])
goto linee;
tj[pin]=ord[i];
pin++;
total++;
linee:;
}
cout<<total;
fclose(stdin);
fclose(stdout);
return 0;
}
by Kaizyn @ 2018-07-26 14:47:25
我也是这样想的欸
去觉得真是天衣无缝
然而剩下三十分呢?
by Kaizyn @ 2018-07-26 14:50:32
第6,9,10个数据点
by 王江睿 @ 2022-08-01 15:22:12
+1