这个链接就不多说了吧。自己的总结,从2011.11.9日开始做的。看看什么时候结束。
不得不说,这里的英文感觉还是很棒的,锻炼下自己的英语阅读,而且TEXT里面的东西对我都是新的东西。
USACO做起来每个题目都很透明,能准确的知道得失,对思维的锻炼还是很棒的。
PROB Your Ride Is Here [ANALYSIS] ---从这个题目开始,慢慢的开始把英语当场一种语言。
TEXT Contest Problem Types ---把题目分成了16类,ad hoc 的意思我猜是杂题。
PROB Greedy Gift Givers [ANALYSIS] ---前面的题目对我来说多不算难,但是看过Analysis后还是大感清晰!
PROB Friday the Thirteenth [ANALYSIS]---万年历,历法问题。附一个自己的模板。
// 1 2 3 4 5 6 7 8 9 10 11 12 int seccMouth[13] = {-1,1,-1,1,0,1,0,1,1,0,1, 0, 1}; int Year[500][13] ={0}; bool isLeapYear(int y) { if((y%4 == 0 && y%100 != 0) || (y%400 == 0)) { return 1; } return 0; } int getDays(int year,int mouth) { if(mouth == 2) { return (28 + isLeapYear(year)); } else if(seccMouth[mouth]) { return 31; } else { return 30; } //return 0; } //打表方法 F(i,405) { FOR(j,1,12) Year[i][j] = sum,sum += getDays(1900 + i,j); } /* Year[x - 1900][y] 表示x年y月份距离1900.1.1的天数,用这个可以求: 这天周几 这个月第几天周几等等…… */
PROB Broken Necklace [ANALYSIS]---最后一个字符串处理的题目,倒是让我认真了很多,也让我想起来电气工程实训的自锁的实现,用flag多个变量设计,实现多锁,互锁,自锁。。……^ ^.
环状的处理最好的方式是吧 S SS,但是有时总长度跃出就不好了!

//2012.3.27
char ssin[400],sscomput[1050];
int main()
{
freopen("beads.in","r",stdin);
freopen("beads.out","w",stdout);
int len,a;
scanf("%d",&a);
scanf(" %s",ssin);
strcpy(sscomput,ssin);
strcpy(sscomput+strlen(ssin),ssin);
len = strlen(sscomput);
//DB(sscomput);
int rightR[1050]={0},rightB[1050]={0},leftR[1050]={0},leftB[1050]={0};
if(sscomput[0] == 'r') leftR[0] = 1;
else if(sscomput[0] == 'b') leftB[0] = 1;
else leftR[0] = leftB[0] = 1;
for(int i =1 ;i<len;i++) {
if(sscomput[i] == 'r') {
leftR[i] = leftR[i-1] + 1;
leftB[i] = 0;
} else if(sscomput[i] == 'b') {
leftB[i] = leftB[i-1] + 1;
leftR[i] = 0;
} else {
leftB[i] = leftB[i-1] + 1;
leftR[i] = leftR[i-1] + 1;
}
}
// for(int i = 0;i<len;i++) {
// printf("%d",leftB[i]);
// }
// puts("----");
// for(int i = 0;i<len;i++) {
// printf("%d",leftR[i]);
// }
// puts("----");
if(sscomput[len-1] == 'r') rightR[len-1] = 1;
else if(sscomput[len-1] == 'b') rightB[len-1] = 1;
else rightR[len-1] = rightB[len-1] = 1;
for(int i = len - 2;i >=0 ;i--) {
if(sscomput[i] == 'r') {
rightR[i] = rightR[i+1] + 1;
rightB[i] = 0;
} else if(sscomput[i] == 'b') {
rightB[i] = rightB[i+1] + 1;
rightR[i] = 0;
} else {
rightB[i] = rightB[i+1] + 1;
rightR[i] = rightR[i+1] + 1;
}
}
// for(int i = 0;i<len;i++) {
// printf("%d",rightB[i]);
// }
// puts("----");
// for(int i = 0;i<len;i++) {
// printf("%d",rightR[i]);
// }
// puts("----");
int ans = 0;
for(int i = 1; i < len - 1;i++) {
ans = max(ans,max(rightB[i]+leftR[i-1],rightR[i]+leftB[i-1]));
}
ans = min(a,ans);
printf("%d\n",ans);
//printf("%d %d\n",rightB[28],leftR[27]);
}
On的算法又是DP。。。