MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

USACO 1.1

Posted on 2011-11-10 20:56  MDeath-Kid  阅读(194)  评论(0)    收藏  举报

这个链接就不多说了吧。自己的总结,从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,但是有时总长度跃出就不好了!

 

DP 做法
//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。。。