【发布时间】:2014-01-10 16:43:35
【问题描述】:
这是a problem from the December 2013 CodeChef Challenge,比赛已经结束。
问题陈述:
输入: n 阶方阵和表示子矩阵的查询。
(x1, y1, x2, y2)
x1, y1表示左上角,x2, y2表示子矩阵的右下端。输出:此子矩阵中不同元素的数量。
约束:
- 时间限制 = 1 秒
- 1≤N≤300
- 1≤Q≤10^5
- 1≤Ai,j≤10
- 1≤X1≤X2≤Ni>
- 1≤Y1≤Y2≤Ni>
这是我尝试过的:
#include<stdio.h>
//#include<conio.h>
int main()
{
//clrscr();
int a[300][300], test[100000], count[10], m, n, c, j, p, q, r, s;
long qu, re, i;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &a[i][j]);
}
}
scanf("%ld", &qu);
for (re = 0; re < qu; re++)
{
c = 0;
for(i = 0; i < 10; i++)
{
count[i] = 0;
}
scanf("%d %d %d %d", &p, &q, &r, &s);
for (i = (p-1); i < r; i++)
{
for (j = (q-1); j < s; j++)
{
m = a[i][j];
count[--m]++;
}
}
for (i = 0; i < 10; i++)
{
if (count[i] != 0)
{
c++;
}
}
test[re] = c;
}
for(i = 0; i < qu; i++)
{
printf("%d\n", test[i]);
}
//getch();
return 0;
}
但我收到了 TLE(超出时间限制)错误。
它必须与每个数字的累积频率有关。
有人可以为这个问题提出一个有效的算法吗?
【问题讨论】:
-
您的代码应适当缩进,以便我们阅读。此外,您应该使用更有意义的变量名,而不是一两个字母的变量名。
-
您似乎假设矩阵仅包含整数 0 到 9。但这在您的问题中没有说明!
标签: c arrays algorithm distinct-values