POJ 1013 Counterfeit Dollar
链接: http://poj.org/problem?id=1013
题意:有一打硬币,其中有一个是假币,质量可能较轻,也可能较重。通过三次称重将假币找出。
由于计算机很难模仿人的想法来实现问题。这道题我纠结了很久。
最后我是通过一一枚举的笨方法做的。就是从A硬币开始到L硬币结束,一一假设其为假币,其中又分为轻和重。当符合三次称重之后便找到了假币。
后来看网上有人是将三次称重这样实现的:给这十二枚硬币赋初值。如果是even,那么硬币值不变。如果是up,那么左边的自加,右边的自减。由于对于不确定的硬币还要做下一次测试。所以通过三次测试之后,偏离初值最大的必然为假币
#include<iostream> #include<cstdio> #include<cstring> #include<string> using namespace std; int main () { int n,i,j,k; cin>>n; while(n--) { char al[3][20],ar[3][20],a[3][10]; int v[15]= {0},visit[15]= {0}; bool flag=true; for (i=0; i<3; i++) cin>>al[i]>>ar[i]>>a[i]; for (i=0; i<24; i++) { flag=true; v[i/2]=(i%2==0?-1:1); for (k=0; k<3; k++) { int left=0,right=0; for (j=0; j<strlen(al[k]); j++) left+=v[al[k][j]-'A']; for (j=0; j<strlen(ar[k]); j++) right+=v[ar[k][j]-'A']; if (strcmp(a[k],"even")==0 && left!=right) flag=false; if (strcmp(a[k],"up")==0 && !(left>right)) flag=false; if (strcmp(a[k],"down")==0 && !(left<right)) flag=false; } v[i/2]=0; if (flag) break; } if (!(i%2)) printf("%c is the counterfeit coin and it is light. \n",i/2+'A'); else printf("%c is the counterfeit coin and it is heavy. \n",i/2+'A'); } return 0; }
POJ 1028 Web Navigation
链接: http://poj.org/problem?id=1028
模拟网页的前进、后退、访问等功能。其实就是栈的一个简单运用
不过在做的时候要注意一个细节,就是无法后退或者无法前进的时候,页面不做反应,即停留在原先初始的地方。
#include<iostream> #include<cstdio> #include<cstring> #include<stack> using namespace std; int main () { string str,now; stack<string> back; stack<string> forward; now="http://www.acm.org/"; while(cin>>str) { if (str=="QUIT") break; if (str=="VISIT") { back.push(now); cin>>now; cout<<now<<endl; while(!forward.empty()) forward.pop(); } if (str=="BACK") { if (back.empty()) cout<<"Ignored"<<endl; else { forward.push(now); now=back.top(); back.pop(); cout<<now<<endl; } } if (str=="FORWARD") { if (forward.empty()) cout<<"Ignored"<<endl; else { back.push(now); now=forward.top(); forward.pop(); cout<<now<<endl; } } } return 0; }
POJ 1045 Bode Plot
链接: http://poj.org/problem?id=1045
一道数学公式推导题(要注意G++编译器double类型要用 .f 输出)
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int main() { double vs,r,c,w,vr; int i,t; scanf("%lf %lf %lf %d",&vs,&r,&c,&t); for(i=1;i<=t;i++) { scanf("%lf",&w); vr=c*r*w*vs/sqrt(1+c*r*w*c*r*w); printf("%.3lf\n",vr);//C++用.lf } return 0; }
POJ 1068 Parencodings
链接: http://poj.org/problem?id=1068
括号匹配,给你一串括号。然后按照右括号的顺序写出一串数字,其中对应的数字代表在右括号前面左括号的数量
按照右括号的顺序求另一串数字,对应的数字代表成对的括号当中包含了几对括号(包括本身)
这也是一道栈的运用的题目。左括号入栈,右括号出栈,在出栈的同时需要记录数据
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<stack> using namespace std; struct node { char ch; int x; }; int main () { int t,n,i,j; cin>>t; while (t--) { int x[21]={0},s=0,p[44]={0}; cin>>n; for (i=0; i<n; i++) { cin>>x[i+1]; for (j=s; j<s+x[i+1]-x[i]; j++) p[j]=1; s=j+1; } stack<node> ss; node temp; temp.ch='('; temp.x=0; ss.push(temp); for (i=0; i<2*n; i++) if (p[i]==1) { temp.ch='('; temp.x=0; ss.push(temp); } else { node first,next; first=ss.top(); ss.pop(); next=ss.top(); ss.pop(); first.x++; next.x+=first.x; cout<<first.x<<" "; ss.push(next); } cout<<endl; } return 0; }
POJ 1657 Distance on Chessboard
链接: http://poj.org/problem?id=1657
在国际象棋中,王、后、车、象分别有不同的走法,分别求一个位置到另一个位置他们走的步数。走不到为Inf
这道题其实就是要注意两点:
1. 可能起始点和终点为同一个点
2. 其中只可能是象走不到,象的走法要注意。
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int main () { int t; cin>>t; while(t>0) { char a,c; int b,d; int x,y; cin>>a>>b>>c>>d; x=fabs(a-c); y=fabs(b-d); int j1,j2,j3; j1=x>y?x:y; if (x==0 && y==0) j2=0; else if (x==0 || y==0) j2=1; else if (x==y) j2=1; else j2=2; if (x==0 && y==0) j3=0; else if (x==0 || y==0) j3=1; else j3=2; cout<<j1<<" "<<j2<<" "<<j3<<" "; if (x==y) printf("%d\n",x==0?0:1); else if ((y-x)%2==0) cout<<"2"<<endl; else cout<<"Inf"<<endl; t--; } return 0; }
POJ 2665 Trees
链接: http://poj.org/problem?id=2665
校门外的树,这道题区域没有重合
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; int main () { int i,j,l,m; while(cin>>l>>m) { if (l==0 && m==0) break; while(m--) { int a,b; cin>>a>>b; l-=(b-a)+1; } cout<<l+1<<endl; } return 0; }
POJ1936 All in All
链接: http://poj.org/problem?id=1936
两串字符串。从母串当中去掉不相关的字符能否得到子串?
设两个指针,分别沿着母串和子串移动。当子串到头时,便表示可以。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; int main () { char sub[100010],str[100010]; int i,j,l1,l2; while(cin>>sub>>str) { l1=strlen(sub); l2=strlen(str); i=j=0; while(i<l1 && j<l2) { if (sub[i]==str[j]) { i++; j++; } else j++; } if (i!=l1) cout<<"No"<<endl; else cout<<"Yes"<<endl; } return 0; }