【发布时间】:2011-04-08 10:12:19
【问题描述】:
这个问题来自 Codechef.com [如果有人还在解决这个问题,请不要在尝试自己之前进一步查看帖子] 虽然它运行正确,但我需要让它更快。我是 c 的初学者,c ++。(我知道数组,字符串和指针,但不知道文件处理等)。所以有没有办法让这个程序运行得更快,而不会使它变得复杂(如果它的算法复杂就可以了)。 如果您提及您所遵循的所有书籍,我也会接受复杂的编码:)。 我目前正在关注罗伯特·拉福尔。 这是程序:-
有 N 个数 a[0],a[1]..a[N - 1]。最初都是 0。你必须执行两种类型的操作:
1) 将索引 A 和 B 之间的数字加 1。这由命令“0 A B”表示
2) 回答索引 A 和 B 之间有多少个数可以被 3 整除。这由命令“1 A B”表示。
输入:
第一行包含两个整数,N 和 Q。接下来的 Q 行中的每一行都是上面提到的“0 A B”或“1 A B”的形式。
输出:
为“1 A B”形式的每个查询输出 1 行,其中包含相应查询所需的答案。
示例输入:
4 7
1 0 3
0 1 2
0 1 3
1 0 0
0 0 3
1 3 3
1 0 3
样本输出:
4
1
0
2
约束:
1 <= N <= 100000
1 <= Q <= 100000
0 <= A <= B <= N - 1
这是我的解决方案:-
#include<stdio.h>
int main()
{
unsigned int n; //amount of numbers taken
scanf("%u",&n);
unsigned int arr[n],q,a,b,count=0,j,i;
short int c;
scanf("%u",&q);//cases taken
for(i=0;i<n;++i)
{
arr[i]=0;
}
for(i=0;i<q;++i)
{
scanf("%d%u%u",&c,&a,&b);//here a,b are A and B respectively and c is either
//o or 1
if(c==0)
{
for(j=a;j<=b;++j)
arr[j]++;
}
if(c==1)
{
for(j=a;j<=b;++j)
{
if(arr[j]%3==0)
count++;
}
printf("%u\n",count);
}
count=0;
}
}
【问题讨论】:
-
为什么我感觉不到一周前就出现了同样的问题?
-
不,正如我所说,这是 codechef.com 的问题。它首先出现在 codechef 的 9 月 1 日。所以它不可能回来超过一周
-
@gamma:我确定是其他人发布的。这是一个非常普遍的问题。很多其他的编程竞赛网站肯定会有这个问题。
-
此代码仅在使用 ISO C99 编译时有效(排除使用 VC++)。我至少建议让它更普遍地便携。
-
@Clifford。如果微软懒得支持一个 10 多年前的标准,那真的会阻碍世界其他地区吗?
标签: c++ c time performance execution