POJ 水题若干

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;
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值