|
从组队做题开始到今天的题目做起来感觉比以往顺手多了~ 有些自己写的小技巧能够实现了,进步是有的,呵呵。 昨晚说要组队做个T-SHIRT的样子,呵呵,这方面实在不擅长,没什么想法。。。 现在我是饿着肚子敲这些字的,中午一起来就12点了,汗,现在饿的根本做不进去题目,幸好已经做了2个题了,今天算是没不完成任务。 深度优先搜索的基本框架和出入还原已经基本掌握, folyd算法的模板能够理解。 高精度计算的书写也已经较为熟练。 处理技巧的应用有所提高。
但是 英文水平实在。。。导致读题理解题意又耗费时间又没有效果,烦了还就干脆不读了。。。 对比较复杂的逻辑判断和字符串处理的题目做起来较慢,耗时间耗精力。 大部分算法没有研究过,遇到问题就是暴力+小优化的想法。 准备假期回家就是刷水题刷水题。。。
准备下学期好好学一下数据结构,掌握了之后去了解算法,写代码熟练程度也是很重要的,现在就应该处于水的阶段。 生活方面白天睡觉晚上闲着,实在是。。。更重要的是不吃饭下午可怎么做题啊。。。
说说这个题目,大家一般都将这个问题抽象成了数学问题来解决,但是我的解法是最直接的枚举,观察题意可知,对每一组数据应该有两种 天平的出解情况,a*x==b*y+d和a*x+d==b*y 对每一种情况按照人放东西的方法来枚举,如果天平的一边重了,就在另一边放上那个a或者b 最后比较两组解哪个更满足题目的答案并输出即可。 附上AC代码
1Problem: 2142 User: hongtaozhy 2Memory: 288K Time: 0MS 3Language: G++ Result: Accepted 4 5Source Code 6#include<stdio.h> 7int x,y; 8void meiju(int a , int b , int d ){ 9 10 x=0;y=0; 11 while(1){ 12 if(a*x<b*y+d) { 13 if (y==0&&(d-a*x)%b==0){ 14 y=(d-a*x)/b; 15 break; 16 } 17 x++; 18 continue ; 19 } 20 if(a*x==b*y+d){ 21 break; 22 } 23 else 24 y++; 25 } 26} 27 28int main(){ 29 30 int a , b , d; 31 int xx,yy; 32 while(scanf("%d%d%d",&a,&b,&d)&&a&&b&&d){ 33 meiju(a,b,d); 34 xx=x;yy=y; 35 // printf("1:%d %d\n",x,y); 36 meiju(b,a,d); 37 // printf("2:%d %d\n",y,x); 38 if(x+y<xx+yy) 39 printf("%d %d\n",y,x); 40 else 41 if((x+y==xx+yy)&&a*x+b*y<a*xx+b*yy) 42 printf("%d %d\n",y,x); 43 else 44 printf("%d %d\n",xx,yy); 45 } 46 47 48return 0; 49} 50 51 52
摘要: 这个题目A的很傻,一次接入三个字符,然后自己不停的来处理各种情况的效果,呵呵,各种格式是应该注意的,空格算是小陷阱?呵呵,所以一般复制那个sample再改就好了,freopen("a.in","r",stdin);freopen("a.out","w",stdout);这种文件读入读出的方式对观察自己的输出结果很有好处,推荐使用防止PE,呵呵,也许是北大的数据比较弱,这个同样的题目在天大的OJ就过... 阅读全文
呵呵,这个题目做出来时候很开心,因为用到了一个小技巧,就是标记格子时候用2进制的变化规则来存储,这样绝不会出现重复,而这个数字最大是2^50,所以要用GCC/G++的long long型C/C++的__int64来存储。呵呵,这样做就只需要判格子即可不需要判边,最后一个DFS查数量就AC了,但是这是数据量范围决定的,>64的就没法这样做了~注意输入数字的大小顺序和自己的程序不符的时候要判断并互换才可以。 附上AC代码,呵呵,blog建立到现在有好几十的阅读量了,很高兴。我在ACM上还是个最菜的级别~希望能通过这个Blog坚持下去,并与大家交流得以提高&&认识些朋友~呵呵,希望大家留个言哈``
1#include<stdio.h> 2#include<string.h> 3long long cake[20][20]; 4int used[20][20]; 5long long now; 6int w,h; 7long long po(int a , int b ){ 8 long long temp; 9 temp = 1 ; 10 for(int i = 0 ; i < b ; i++){ 11 temp = 2*temp; 12 } 13 return temp; 14} 15 16void dfs(int j , int i ){ 17if(i<0||j<0||i>=w||j>=h) return; 18if(used[j][i]!=0) return; 19if(cake[j][i]!=now) return; 20used[j][i]=1; 21dfs(j+1,i); 22dfs(j-1,i); 23dfs(j,i+1); 24dfs(j,i-1); 25} 26 27int main(){ 28 int count; 29 int t; 30 long long im; 31 int n; 32 int x1,x2,y1,y2; 33 while(scanf("%d%d",&w,&h)&&w&&h){ 34 scanf("%d",&n); 35 memset(cake,-1,sizeof(cake)); 36 memset(used,-1,sizeof(used)); 37 count=0; 38 for(int i = 0 ; i < w ; i++ ) 39 for(int j = 0 ; j < h ; j++ ) 40 { cake[j][i] = 0 ; 41 used[j][i] = 0 ; 42 } 43 for(int i = 0 ; i < n ; i++ ){ 44 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 45 46 if (x1>x2) {t=x1;x1=x2;x2=t;} 47 if (y1>y2) {t=y1;y1=y2;y2=t;} 48 49 for( int j = x1 ; j < x2 ; j++ ){ 50 for ( int k = y1 ; k < y2 ; k++ ){ 51 cake[j][k] += po(2,i); 52 } 53 } 54 } 55 for(int i = 0 ; i < w ; i++ ) 56 for(int j = 0 ; j < h ; j++ ) 57 if(used[j][i]==0){ 58 now=cake[j][i]; 59 dfs(j,i); 60 count++; 61 } 62 printf("%d\n",count); 63 } 64return 0; 65} 66 67
摘要: http://acm.pku.edu.cn/JudgeOnline/problem?id=1001求高精度幂的题目,题目的难度在于处理如同 .00010 的输入
和输出的前导后导零的问题,还有小数点的位置可能在处理输入时候被影响写了好久代码,但是同学用JAVA只需要一会就能搞定了,郁闷...附上AC代码:
1Source Code 2&n... 阅读全文
通过这两个题目练习了代码的熟练程度 发现了一个很好的网址: http://www.nocow.cn/index.php/USACO_Training一个OIER做的wiki 里面有USACO题目的翻译和标程 了解到了 蔡勒公式 一个计算 星期的公式。 即随便给一个日期,就能用这个公式推算出是星期几。 蔡勒公式如下: W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1 详见: http://baike.baidu.com/view/598757.htm附上两题的代码
1 /* 2 ID: hongtaozhy 3 LANG: C++ 4 TASK: gift1 5 */ 6 #include <stdio.h> 7 #include <string.h> 8 char name[10][15]; 9 char temp[15],temp2[15]; 10 int money[10]; 11 int rec; 12 int key; 13 int main () { 14 15 freopen ("gift1.in", "r",stdin); 16 freopen ("gift1.out", "w",stdout); 17 int n ; 18 int i ; 19 scanf("%d",&n); 20 21 for( int i = 0 ; i < n ; i++ ) 22 scanf("%s",name[i]); 23 24 while(scanf("%s",temp)!=EOF){ 25 key = 0; 26 for( int i = 0 ; i < n ; i++ ){ 27 if(!strcmp(name[i],temp)){ 28 rec = i ; 29 break; 30 } 31 } 32 int nn; 33 int mon; 34 35 36 scanf("%d%d",&mon,&nn); 37 if( nn != 0 ) 38 key = mon - ( mon / nn ) * nn ; 39 money[rec] -= mon ; 40 money[rec] += key ; 41 42 for( int i = 0 ; i < nn ; i++ ){ 43 44 scanf("%s",temp2); 45 for( int j = 0 ; j < n ; j++ ){ 46 if(!strcmp(name[j],temp2)){ 47 rec = j ; 48 break; 49 } 50 } 51 52 money[rec] += mon / (nn) ; 53 54 55 } 56 } 57 58 for(int i = 0 ; i < n ; i++ ){ 59 printf("%s %d\n",name[i],money[i]); 60 } 61 62 63 return 0; 64 } 65
1 /* 2 ID: hongtaozhy 3 LANG: C++ 4 TASK: friday 5 */ 6 #include <stdio.h> 7 int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 8 int day[7]; 9 10 int main () { 11 freopen ("friday.in", "r",stdin); 12 freopen ("friday.out", "w",stdout); 13 14 int i,j,l=6,n; 15 scanf("%d",&n); 16 n+=1900; 17 for(i=1900;i<n;i++){ 18 if((i%100!=0 && i%4==0)||i%400==0)mon[1]++; 19 for(j=0;j<12;j++){ 20 day[l]++; 21 l+=mon[j]; 22 l%=7; 23 } 24 mon[1]=28; 25 } 26 printf("%d",day[6]); 27 for(i=0;i<6;i++) 28 printf(" %d",day[i]); 29 printf("\n"); 30 31 return 0; 32 } 33
过了两个熟悉系统的题目,这个平台的题目对算法的理解很有帮助,而且给出测试数据可以便于找到自己的错误,很好~ 想想这个是为了IOI准备的题库,也就是中学生竞赛所用,感觉到了大学才开始了解程序的我们,未免有些伤怀,不过没什么,只要努力就好,希望这个假期和以后能够为之而奋斗,提升解题和英语能力! 2000+2000=hadn't !
1 /* 2 ID: hongtaozhy 3 LANG: C++ 4 TASK: test 5 */ 6 #include <stdio.h> 7 int main () { 8 freopen ("test.in", "r",stdin); 9 freopen ("test.out", "w",stdout); 10 int a, b; 11 scanf ("%d %d", &a, &b); /* the two input integers */ 12 printf ("%d\n", a+b); 13 return 0; 14 } 15
1 /* 2 ID: hongtaozhy 3 LANG: C++ 4 TASK: ride 5 */ 6 #include <stdio.h> 7 #include <string.h> 8 char a[7],b[7]; 9 int sum1,sum2; 10 int main () { 11 freopen ("ride.in", "r",stdin); 12 freopen ("ride.out", "w",stdout); 13 14 while(scanf("%s%s",a,b)==2){ 15 sum1=1; 16 sum2=1; 17 18 for(int i = 0 ; i< strlen(a) ; i++) 19 sum1 *= a[i] - 'A' + 1; 20 for(int i = 0 ; i< strlen(b) ; i++) 21 sum2 *= b[i] - 'A' + 1; 22 23 sum1 = sum1 % 47; 24 sum2 = sum2 % 47; 25 26 27 28 if(sum1 == sum2 ) 29 printf("GO\n"); 30 else printf("STAY\n"); 31 } 32 33 return 0; 34 } 35
|