-
-
[旧帖] [原创]思路先入为主引起的一个错误 0.00雪花
-
发表于: 2010-12-16 21:14 1192
-
在USACO上做题,遇到的。
像我一样的菜鸟可以看看,老鸟可以直接无视我,丝毫没有技术含量。
题目:
Broken Necklace
You have a necklace of N red, white, or blue beads (3<=N<=350) some of which are red, others blue, and others white, arranged at random. Here are two examples for n=29:
1 2 1 2
r b b r b r r b
r b b b
r r b r
r r w r
b r w w
b b r r
b b b b
b b r b
r r b r
b r r r
b r r r
r r r b
r b r r r w
Figure A Figure B
r red bead
b blue bead
w white bead
The beads considered first and second in the text that follows have been marked in the picture.
The configuration in Figure A may be represented as a string of b's and r's, where b represents a blue bead and r represents a red one, as follows: brbrrrbbbrrrrrbrrbbrbbbbrrrrb .
Suppose you are to break the necklace at some point, lay it out straight, and then collect beads of the same color from one end until you reach a bead of a different color, and do the same for the other end (which might not be of the same color as the beads collected before this).
Determine the point where the necklace should be broken so that the most number of beads can be collected.
Example
For example, for the necklace in Figure A, 8 beads can be collected, with the breaking point either between bead 9 and bead 10 or else between bead 24 and bead 25.
In some necklaces, white beads had been included as shown in Figure B above. When collecting beads, a white bead that is encountered may be treated as either red or blue and then painted with the desired color. The string that represents this configuration will include the three symbols r, b and w.
Write a program to determine the largest number of beads that can be collected from a supplied necklace.
PROGRAM NAME: beads
INPUT FORMAT
Line 1: N, the number of beads
Line 2: a string of N characters, each of which is r, b, or w
SAMPLE INPUT (file beads.in)
29
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
OUTPUT FORMAT
A single line containing the maximum of number of beads that can be collected from the supplied necklace.
SAMPLE OUTPUT (file beads.out)
11
OUTPUT EXPLANATION
Consider two copies of the beads (kind of like being able to runaround the ends). The string of 11 is marked.
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
****** *****
==================
提交的代码如下,前2次测试数据都通过了,第3个却错了,呵呵,大家看的出程序错在哪里么?不许用OD调试哦~
#include <stdio.h>
#include <string.h>
int main ()
{
int n,i;
int j,k,left,right;
int b[400];
int max=0,max1=0;
char a[400];
FILE *fin=fopen("beads.in","r"),*fout=fopen("beads.out","w");;
fscanf(fin,"%d\n%s",&n,a);
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
{
left=0;right=1;
while(i-left>=0&&(a[i-left]==a[i]||a[i-left]=='w')) left++;
while(i+right<n&&(a[i+right]==a[i+1]||a[i+right]=='w')) right++;
b[i]=left+right-1;
if(max<b[i]) max=b[i];
}
for(k=n;k>0;k--) a[k]=a[k-1];
a[0]=a[n];
if(max1<max) max1=max;
}
fprintf(fout,"%d\n",max1);
fclose(fin);
fclose(fout);
exit(0);
}
=======================
提示:第三次的测试结果:
> Run 3: Execution error: Your program did not produce an answer
that was judged as correct. The program stopped at 0.011 seconds;
it used 1900 KB of memory.
Here are the respective outputs:
----- our output ---------
74
---- your output ---------
72
--------------------------
------ Data for Run 3 ------
77
rwrwrwrwrwrwrwrwrwrwrwrwbwrwbwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwr
=====
呵呵 最好自己先编一下,不然容易被给定的程序给绕进去,反正我是用OD调试了菜知道错在哪里的。。
强烈建议 老鸟无视我
像我一样的菜鸟可以看看,老鸟可以直接无视我,丝毫没有技术含量。
题目:
Broken Necklace
You have a necklace of N red, white, or blue beads (3<=N<=350) some of which are red, others blue, and others white, arranged at random. Here are two examples for n=29:
1 2 1 2
r b b r b r r b
r b b b
r r b r
r r w r
b r w w
b b r r
b b b b
b b r b
r r b r
b r r r
b r r r
r r r b
r b r r r w
Figure A Figure B
r red bead
b blue bead
w white bead
The beads considered first and second in the text that follows have been marked in the picture.
The configuration in Figure A may be represented as a string of b's and r's, where b represents a blue bead and r represents a red one, as follows: brbrrrbbbrrrrrbrrbbrbbbbrrrrb .
Suppose you are to break the necklace at some point, lay it out straight, and then collect beads of the same color from one end until you reach a bead of a different color, and do the same for the other end (which might not be of the same color as the beads collected before this).
Determine the point where the necklace should be broken so that the most number of beads can be collected.
Example
For example, for the necklace in Figure A, 8 beads can be collected, with the breaking point either between bead 9 and bead 10 or else between bead 24 and bead 25.
In some necklaces, white beads had been included as shown in Figure B above. When collecting beads, a white bead that is encountered may be treated as either red or blue and then painted with the desired color. The string that represents this configuration will include the three symbols r, b and w.
Write a program to determine the largest number of beads that can be collected from a supplied necklace.
PROGRAM NAME: beads
INPUT FORMAT
Line 1: N, the number of beads
Line 2: a string of N characters, each of which is r, b, or w
SAMPLE INPUT (file beads.in)
29
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
OUTPUT FORMAT
A single line containing the maximum of number of beads that can be collected from the supplied necklace.
SAMPLE OUTPUT (file beads.out)
11
OUTPUT EXPLANATION
Consider two copies of the beads (kind of like being able to runaround the ends). The string of 11 is marked.
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
****** *****
==================
提交的代码如下,前2次测试数据都通过了,第3个却错了,呵呵,大家看的出程序错在哪里么?不许用OD调试哦~
#include <stdio.h>
#include <string.h>
int main ()
{
int n,i;
int j,k,left,right;
int b[400];
int max=0,max1=0;
char a[400];
FILE *fin=fopen("beads.in","r"),*fout=fopen("beads.out","w");;
fscanf(fin,"%d\n%s",&n,a);
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
{
left=0;right=1;
while(i-left>=0&&(a[i-left]==a[i]||a[i-left]=='w')) left++;
while(i+right<n&&(a[i+right]==a[i+1]||a[i+right]=='w')) right++;
b[i]=left+right-1;
if(max<b[i]) max=b[i];
}
for(k=n;k>0;k--) a[k]=a[k-1];
a[0]=a[n];
if(max1<max) max1=max;
}
fprintf(fout,"%d\n",max1);
fclose(fin);
fclose(fout);
exit(0);
}
=======================
提示:第三次的测试结果:
> Run 3: Execution error: Your program did not produce an answer
that was judged as correct. The program stopped at 0.011 seconds;
it used 1900 KB of memory.
Here are the respective outputs:
----- our output ---------
74
---- your output ---------
72
--------------------------
------ Data for Run 3 ------
77
rwrwrwrwrwrwrwrwrwrwrwrwbwrwbwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwr
=====
呵呵 最好自己先编一下,不然容易被给定的程序给绕进去,反正我是用OD调试了菜知道错在哪里的。。
强烈建议 老鸟无视我
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
- RadAsm编译DOS程序出错 4742
- 关于ZProtect的脱壳方法 5681
- [原创]一起来写控制普通键盘上的3盏LED的驱动 9969
- [原创]思路先入为主引起的一个错误 1193
- [原创]一个定式思维带来的错误 1004
看原图
赞赏
雪币:
留言: