博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【USACO】beads
阅读量:7105 次
发布时间:2019-06-28

本文共 9547 字,大约阅读时间需要 31 分钟。

题目:

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 can include any of 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.

 

这一道题做了一整天,更郁闷的是对完答案发现自己的方法太复杂了

我总是想着先把整个项链都染色成 red 或 blue 然后把每一段的相同颜色串的数量数出来 实际上可以每次只考虑一个缺口位置的局部信息就好了  不需要提前染色 也不需要将整个项链的所有相同颜色玻璃串的个数存起来 因为存起来后 对于rwb bwr的情况还是要单独分析

用到了一些小技巧:

1.环装一定会用到mod 不过一般都是数字超过了范围用模电 这个项链可能数到-1 、-2 需要自己定义一个新的有负数的mod 或者 把信息存储两遍这样 可以在第一遍存储的最后可以直接通过加法读取下一个存储的起始的玻璃珠信息

 

答案:思路最清楚的代码

 

#include 
#include
#include
#define MAXN 400char necklace[MAXN];int len;/* * Return n mod m. The C % operator is not enough because * its behavior is undefined on negative numbers. */int mod(int n, int m){ while(n < 0) n += m; return n%m;}/* * Calculate number of beads gotten by breaking * before character p and going in direction dir, * which is 1 for forward and -1 for backward. */intnbreak(int p, int dir){ char color; int i, n; color = 'w'; /* Start at p if going forward, bead before if going backward */ if(dir > 0) i = p; else i = mod(p-1, len); /* We use "n
m) m = n; } /* * If the whole necklace can be gotten with a good * break, we'll sometimes count beads more than * once. this can only happen when the whole necklace * can be taken, when beads that can be grabbed from * the right of the break can also be grabbed from the left. */ if(m > len) m = len; fprintf(fout, "%d\n", m); exit (0);}

 

动态规划的答案我没怎么看还:

#include 
#include
#include
using namespace std;FILE *in,*out;int main () { in = fopen("beads.in", "r"); out = fopen ("beads.out", "w"); int n; char tmp[400], s[800]; fscanf(in, "%d %s", &n, tmp); strcpy(s, tmp); strcat(s, tmp); int left[800][2], right[800][2]; left[0][0] = left[0][1] = 0; for (int i=1; i<= 2 * n; i++){ if (s[i - 1] == 'r'){ left[i][0] = left[i - 1][0] + 1; left[i][1] = 0; } else if (s[i - 1] == 'b'){ left[i][1] = left[i - 1][1] + 1; left[i][0] = 0; } else { left[i][0] = left[i - 1][0] + 1; left[i][1] = left[i - 1][1] + 1; } } right[2 * n][0] = right[2 * n][1] = 0; for (int i=2 * n - 1; i >= 0; i--){ if (s[i] == 'r'){ right[i][0] = right[i + 1][0] + 1; right[i][1] = 0; } else if (s[i] == 'b'){ right[i][1] = right[i + 1][1] + 1; right[i][0] = 0; } else { right[i][0] = right[i + 1][0] + 1; right[i][1] = right[i + 1][1] + 1; } } int m = 0; for (int i=0; i<2 * n; i++) m = max(m, max(left[i][0], left[i][1]) + max(right[i][0], right[i][1])); m = min(m, n); fprintf(out, "%d\n", m); fclose(in); fclose(out); return 0;}

 

简便的方案:

#include 
#include
using namespace std;int main() { fstream input, output; string inputFilename = "beads.in", outputFilename = "beads.out"; input.open(inputFilename.c_str(), ios::in); output.open(outputFilename.c_str(), ios::out); int n, max=0, current, state, i, j; string s; char c; input >> n >> s; s = s+s; for(i=0; i
max) max = current; } // for output << max << endl; return 0;} // main

 

我自己写的非常复杂 但至少还对了的代码:

#include
#include
#include
#define MaxLength 350typedef struct{ int color; int num; int type;} Pos;typedef struct { int colorleft; int colorright; int location; int length;}RWB;typedef struct { int num; int type;}NUM;enum Type{left, right};int main(){ FILE *in, *out; int num, longgest = 0; int countr = 0, countb = 0; int tmp; int length = 0; int recordnum = 0, recorddnum = 0; int i = 0, j; int first = -1; //最小的记录点 char necklace[351]; in = fopen("beads.in", "r"); out = fopen("beads.out", "w"); fscanf(in, "%d", &length); fscanf(in, "%s", necklace); while(i < length) //得到项链长度 { if(necklace[i] == 'r') countr++; else if(necklace[i] == 'b') countb++; i++; } if(countr == 0 || countb == 0) { fprintf(out ,"%d\n", length); return 0; } Pos record[MaxLength]; RWB recordd[MaxLength]; i = 0; while(i < length) //定位第一个left { if(necklace[i] != 'w' && necklace[i+1] == 'w') { first = i; record[0].color = necklace[i]; record[0].num = i; record[0].type = left; recordnum++; break; } i++; }if(first != -1){ for(i = first + 1 ; i != first; i = (i + 1) % length) //记录 bw wb rw wr的位置 { if(necklace[i] != 'w' && necklace[(i+1)%length] == 'w') { record[recordnum].color = necklace[i]; record[recordnum].num = i; record[recordnum].type = left; recordnum++; } else if(necklace[i] == 'w' && necklace[(i+1)%length] != 'w') { record[recordnum].color = necklace[(i+1)%length]; record[recordnum].num = (i+1)%length; record[recordnum].type = right; recordnum++; } } assert(recordnum % 2 == 0); assert(record[recordnum-1].type == right); for(i = 0; i < recordnum; i = i + 2) //根据记录信息 将 rw...wr 和 bw...wb的直接染色 将 rw..wb bw..wr的取出 { assert((record[i].type == left && record[i+1].type == right)); if(record[i].color == record[i+1].color) { for(j = (record[i].num + 1)%length; j != record[i+1].num; j = (j + 1) % length) { necklace[j] = record[i].color; } } else { recordd[recorddnum].colorleft = record[i].color; recordd[recorddnum].colorright = record[i+1].color; recordd[recorddnum].length = record[i+1].num - record[i].num - 1; recordd[recorddnum].location = record[i].num; recorddnum++; } }} //fprintf(out,"%s",necklace); NUM record2[MaxLength]; int record2num = 0; int numtmp = 1; for(i = 0; i < length; i++) //统计项链相同颜色的个数 存放在数组中 { if(necklace[i] == necklace[i+1] ) { numtmp++; } else { record2[record2num].num = numtmp; if(necklace[i] == 'w') record2[record2num].type = 1; else record2[record2num].type = 0; numtmp = 1; record2num++; } } if(necklace[0] == necklace[length - 1]) //处理最后颜色与第一个颜色相同 { record2num--; record2[0].num += record2[record2num].num; } for(i = 0; i < record2num; i++) { record2[record2num + i] = record2[i]; } int longgesttmp = 0; int n; for(i = 0; i < record2num ;i++) //根据存储的数组找最长链 { n = 0; j = i; longgesttmp = 0; while(1) { if(record2[j].type == 0) n++; if(n == 2 && j % record2num == i && record2[j].type == 1) break; if(n<3) longgesttmp += record2[j].num; else break; j++; } if(longgesttmp > longgest) { longgest = longgesttmp; } } fprintf(out , "%d\n", longgest); return 0;}

 

转载地址:http://ejchl.baihongyu.com/

你可能感兴趣的文章
MIUI刷机曝重大危险 可致短信照片等个人隐私被盗
查看>>
物联网时代 企业需做出的十大战略选择
查看>>
IEEE中国区总裁赵永前:IEEE与未来网络技术
查看>>
光速运行的量子加密
查看>>
ESG:浅析思科进军服务器市场行业影响
查看>>
美国“黑色星期五”单日销量不及双十一
查看>>
探索Javascript异步编程
查看>>
云计算:对计算能力进行贩售的方式
查看>>
《中国人工智能学会通讯》——11.20 多任务学习在交通分析中的应用
查看>>
分析:大数据如何催化电子商务企业
查看>>
H3C吴健:技术与行业理解是我们的核心竞争力
查看>>
CycleBeads:App不仅能避孕,成功率还有95%
查看>>
Android热修复技术总结
查看>>
飞康软件定义平台为Oracle提供全面保护与恢复
查看>>
Java常用算法1——冒泡排序
查看>>
如何在数据中心行业玩转互联网思维?
查看>>
9月6日云栖精选夜读:DMS前后端技术揭秘及最佳实践
查看>>
Oracle Resource Manager和调度任务
查看>>
OpenStack建设企业私有云要解决五大问题
查看>>
美国抢跑5G高频段规划,我国如何应对挑战?
查看>>