Description
Alice上化学课时又分心了,他首先画了一个3行N列的表格,然后把数字1到N填入表格的第一行,保证每个数只出现一次,另外两行他也填入数字1到N,但不限制每个数字的出现次数。
Alice现在想删除若干列使得每一行排完序后完全一样,编程计算最少需要删除多少列。
Input
第一行包含一个整数N(1<=N<=100000),表示表格的列数。
接下来三行每行包含N个整数,每个数在1到N之间,而且第一行的数互不相同。
Output
输出最少需要删除的列数。
Hint
[数据范围]
40%的数据N<=100
70%的数据N<=10000
分析
连我这个水逼都为之动容可见题目之水
直接暴枚可以过而且很快很快,属于玄学范围不予讨论
code
#include <stdio.h>
#include <cstring>
using namespace std;
int a[100001],b[100001],c[100001];
int ta[100001],tb[100001],tc[100001];
int main()
{
int n;
memset(ta,0,sizeof(ta));
memset(tb,0,sizeof(tb));
memset(tb,0,sizeof(tc));
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
for (int i=1;i<=n;i++)
scanf("%d",&b[i]);
for (int i=1;i<=n;i++)
scanf("%d",&c[i]);
for (int i=1;i<=n;i++)
{
ta[a[i]]++;
tb[b[i]]++;
tc[c[i]]++;
}
int ans=0;
bool flag;
do
{
flag=false;
for (int i=1;i<=n;i++)
if (a[i])
if ((!tb[a[i]])||(!tc[a[i]]))
{
ans++;
a[i]=0;
flag=true;
tb[b[i]]--;
tc[c[i]]--;
}
}while(flag);
printf("%d\n",ans);
return 0;
}