算法练习
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法练习相关的知识,希望对你有一定的参考价值。
昨天是个值得纪念的日子,我数学建模拿了推荐国家一等奖的名额,希望最后能顺利拿到国一吧。现在大三已经开学一个月了。这一个月因为社会实践评优的事情真的很忙,还好最后拿到了可能拿到的所有的奖项。结果自己把科研助手这件事给耽误了,今天去找马老师,结果马老师的实验室人已经满了。所以没办法,我可能又要去找其他老师了。
今年国家奖学金的名额里面没有我,没有就算了吧。卧薪尝胆,好好学习,这一学期至关重要。所以自己现在就要开始准备保研的机试,现在的训练非常重要,无论如何,这是自己未来要走的一步路。我现在最重要的就是六级、学习、机试、科研,这四个缺一不可。加油加油!所以今天是C语言算法的基础部分:自顶向下的编程方法。
1.UVa1339古老的密码
#include <iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int cnt1[26],cnt2[26]; char s1[110],s2[110]; int main() { while(scanf("%s%s",s1,s2)==2){ int len1 = strlen(s1); int len2 = strlen(s2); memset(cnt1,0,sizeof(cnt1)); memset(cnt2,0,sizeof(cnt2)); for(int i = 0;i<len1;++i){ for(int j = 0;j<26;++j){ if(s1[i]-65==j){cnt1[j]++;break;} } } for(int i = 0;i<len2;++i){ for(int j = 0;j<26;++j){ if(s2[i]-65==j){cnt2[j]++;break;} } } sort(cnt1,cnt1+26); sort(cnt2,cnt2+26); bool eq = 1; for(int i = 0;i<26;++i){ //printf("%d %d\n",cnt1[i],cnt2[i]); if(cnt1[i]!=cnt2[i]){eq = 0;break;} } if(eq){ printf("YES\n"); }else{ printf("NO\n"); } } return 0; }
2.Uva489 Hangman Judge
#include<stdio.h> #include<string.h> #define MAX 100 char s1[MAX],s2[MAX]; bool win = 0,lose = 0; int left,chance; void guess(char c){ int len = strlen(s1); bool find = 0; for(int i = 0;i<len;++i){ if(s1[i]==c){ left--; s1[i]=‘ ‘; find = 1; } } if(!find)chance--; if(!chance)lose = 1; else if(!left)win = 1; } int main(){ int rd; while(scanf("%d%s%s",&rd,s1,s2)==3&&rd!=-1){ win = 0;lose = 0; printf("Round %d\n",rd); chance = 7; left = strlen(s1); int len = strlen(s2); for(int i = 0;i<len;++i){ guess(s2[i]); if(win||lose)break; } if(win){ printf("You win.\n"); }else if(lose){ printf("You lose.\n"); }else{ printf("You chickened out!\n"); } } return 0; }
3.Uva133 The Dole Queue
#include<stdio.h> #include<string.h> int n,k,m; //人本身是按照逆时针排序的 int go(int p,int d,int t,int a[]){ while(t--){ do{ p = (p-1+d+n)%n+1; }while(a[p]==1); } return p; } int main(){ while(scanf("%d%d%d",&n,&k,&m)==3&&n){ int a[n+1]; memset(a,0,sizeof(a)); int p1 = n; int p2 = 1; int left = n; while(left){//人数有剩余 p1 = go(p1,1,k,a); p2 = go(p2,-1,m,a); a[p1] = 1; a[p2] = 1; printf("%3d",p1); --left; if(p2!=p1){printf(" %3d",p2);--left;} if(left)printf(","); } printf("\n"); } return 0; }
4.Uva213 Message Decoding
#include<stdio.h> #include<string.h> int code[8][1<<8]; int readchar(){ for(;;){ int ch = getchar(); if(ch!=‘\r‘&&ch !=‘\n‘)return ch; } } int readint(int c){ int v = 0; while(c--){ v = v*2+readchar()-‘0‘; } return v; } int readcodes(){ memset(code,0,sizeof(code)); code[1][0] = readchar(); int ch; for(int len = 2;len<8;++len){ for(int i = 0;i<(1<<len)-1;++i){ ch = getchar(); if(ch==EOF)return 0; if(ch == ‘\n‘||ch == ‘\r‘) return 1; code[len][i] = ch; } } return 1; } int main(){ while(readcodes()){ for(;;){ int len = readint(3); if(len==0)break; for(;;){ int v = readint(len); if(v == (1<<len)-1)break; putchar(code[len][v]); } } printf("\n"); } return 0; }
总结:以上每个小程序的代码量都不超过50行,但都是非常经典的小程序,采用自顶向下的编程方法,使得程序的逻辑非常清晰。
以上是关于算法练习的主要内容,如果未能解决你的问题,请参考以下文章
Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)(代码片段
有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]