试题 算法训练 审美课
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
《审美的历程》课上有n位学生,帅老师展示了m幅画,其中有些是梵高的作品,另外的都出自五岁小朋友之手。老师请同学们分辨哪些画的作者是梵高,但是老师自己并没有答案,因为这些画看上去都像是小朋友画的……老师只想知道,有多少对同学给出的答案完全相反,这样他就可以用这个数据去揭穿披着皇帝新衣的抽象艺术了(支持帅老师_)。
答案完全相反是指对每一幅画的判断都相反。
输入格式
第一行两个数n和m,表示学生数和图画数;
接下来是一个n*m的01矩阵A:
如果aij=0,表示学生i觉得第j幅画是小朋友画的;
如果aij=1,表示学生i觉得第j幅画是梵高画的。
输出格式
输出一个数ans:表示有多少对同学的答案完全相反。
样例输入
3 2
1 0
0 1
1 0
样例输出
2
样例说明
同学1和同学2的答案完全相反;
同学2和同学3的答案完全相反;
所以答案是2。
数据规模和约定
对于50%的数据:n<=1000;
对于80%的数据:n<=10000;
对于100%的数据:n<=50000,m<=20。
我的代码如下:
#include<iostream>
using namespace std;
int res=0;//最终结果
void f(int a[][21],int nub,int h,int l);
int main()
{
int num;//学生人数
cin>>num;
int drs;//画的数量
cin>>drs;
drs=drs+1;
int a[num][21];//列数多一列,a[][0]用于标记是否已匹配
int i;
int j;
for(i=0;i<num;i++)
{
a[i][0]=0;//全部初始化为0,表示还未匹配;
for(j=1;j<drs;j++)
{
cin>>a[i][j];
}
}
for(i=0;i<num;i++)
{
f(a,i,num,drs);
}
cout<<res;
return 0;
}
void f(int a[][21],int nub,int h,int l)
{
if(a[nub][0]==1);//若已标记匹配过 直接退出
else
{
int same=1,flag,rev=0,result;//same 相同评论的学生数,rev 相反
int i,j;
for(i=nub+1;i<h;i++)
{
if(a[i][0]==1) continue;
else
{
for(j=1;j<l;j++)//检查相同评论的学生
{
if(a[nub][j]==a[i][j]) continue;
else break;
}
if(j==l)
{
same++;
a[i][0]=1;//已匹配
}
for(j=1;j<l;j++)//检查相反评论的学生
{
if(a[nub][j]!=a[i][j]) continue;
else break;
}
if(j==l)
{
rev++;
a[i][0]=1;//已匹配
}
}
}
result=same*rev;
res=res+result;
}
}
系统评测结果如下:
最后一个超时了,求优化,感谢感谢。