zoukankan      html  css  js  c++  java
  • 算法竞赛入门经典(第六章)

    习题6-1,UVa673,Time:11.1

    #include <iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<string>
    #include <stack>
    using namespace std;
    int main() {
        int Case;
        string str;
        bool flag;
        scanf("%d",&Case);
        for(int c = 1; c <= Case; c++)
        {
            stack<char>q;
            flag = true;
            cin>>str;
            for(int i = 0; i < str.length(); i++)
            {
                if(q.size() == 0 || str[i]=='(' || str[i]=='[')        q.push(str[i]);
                else
                {
                    if((str[i]==')' && q.top()=='(') || (str[i]==']' && q.top()=='['))
                    {
                        q.pop();
                    }
                    else
                    {
                        flag = false;
                        break;    
                    }
                }
            }
            if(flag==false || q.size())        cout<<"NO"<<endl;
            else     cout<<"YES"<<endl;
        }
        return 0;
    }
    

      

     习题6-2,UVa712,Time:11.1

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    using namespace std;
    struct node
    {
    	int l, r, s;
    }num[1<<8+10];
    int n, m;
    int ans[1005];
    string str;
    int build(int i, int l, int r)
    {
    	num[i].l = l;
    	num[i].r = r;
    	if(l == r)
    	{
    		num[i].s = str[l-1] - '0';
    	}	
    	else
    	{
    		build(i+i, l, (l+r)>>1);
    		build(i+i+1,((l+r)>>1)+1,r);
    	} 
    }
    
    int solve()
    {
    	int k = 1;
    	for(int i = 0; i < n; i++)
    	{
    		k+=k;
    		k+=(str[i] - '0');
    	}
    	return num[k].s;
    }
    
    int main()
    {
    	while( cin>>n )
    	{
    		cin>>str;
    		build(1, 1, 1<<n);
    		cin>>m;
    		for(int i = 0; i < m; i++)
    		{
    			cin>>str;
    			ans[i] = solve();			
    		}
    		for(int i = 0; i < m; i++)
    			cout<<ans[i];
    		cout<<endl;
    	} 
    	return 0;
    } 
    

     习题6-3,UVa536,Time:11.2

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    using namespace std;
    char pre_order[100005];
    char in_order[100005];
    char post_order[100005];
    int pl, il;
    int dfs(char* spo, char* fpo, char* sio, char* fio)
    {
    	if(fpo < spo || fio < sio)	return 0;
    	char g = *spo;
    	int sn = 0;
    
    	while(*(sio + sn) != g)	sn++;
    
    	dfs(spo + 1, spo + sn, sio, sio + sn);
    	dfs(spo + sn + 1, fpo, sio + sn + 1, fio);
    	cout<<*spo; 
    
    } 
    
    int main()
    {
    	freopen("in.txt","r",stdin);
    	while( cin>>pre_order>>in_order )
    	{
    		pl = strlen(pre_order);
    		il = strlen(in_order);
    		dfs(pre_order, pre_order + pl - 1, in_order, in_order + il - 1);
    		cout<<endl;
    	} 
    	return 0;
    } 
    

     习题6-4,UVa439,Time:11.2

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <queue>
    using namespace std;
    int d[10][2] = {{1,2},{2,1},{-1,2},{2,-1},{-2,1},{1,-2},{-1,-2},{-2,-1}};
    int map[10][10];
    struct node
    {
    	bool operator <(const node &a)const 
    	{
    		return a.s<s; 
    	}
    	int x, y, s;
    };
    
    int main()
    {
    	int x, y;
    	int ex, ey;
    	node v, u;
    	freopen("in.txt","r",stdin);
    	while(cin>>x>>y)
    	{
    		memset(map,0,sizeof(map));
    		cin>>ex>>ey;
    		priority_queue<node>q;
    		v.x = x;
    		v.y = y;
    		v.s = 0;
    		q.push(v);
    		while(1)
    		{
    			v = q.top();
    			q.pop();
    			if(map[v.x][v.y] == 0)
    				map[v.x][v.y] = v.s;
    			else
    				continue;
    			if(v.x == ex && v.y == ey)
    			{
    				cout<<v.s;
    				break;
    			}
    			
    			for(int i = 0; i < 8; i++)
    			{
    				u.x = v.x + d[i][0];
    				u.y = v.y + d[i][1];
    				u.s = v.s + 1;
    				if(u.x > 0 && u.y <= 8 && u.x <=8 && u.y >0 && map[u.x][u.y] == 0)
    					q.push(u); 
    			}
    		}
    	}
    	return 0;
    } 
    

     习题6-5,UVa1600,Time:11.2

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <queue>
    using namespace std;
    int map[25][25];
    int stp[25][25];
    int d[5][2]={{1,0},{0,1},{-1,0},{0,-1}};
    struct node
    {
    	bool operator <(const node &a )const
    	{
    		return a.s<s;
    	}
    	int x, y, s, k;
    };
    
    int main()
    {
    	freopen("in.txt","r",stdin);
    	int m, n, x;
    	node v, u;
    	while(cin>>m>>n)
    	{
    		memset(map,0,sizeof(map));
    		memset(stp,0,sizeof(stp));
    		priority_queue<node>q;
    		for(int i = 1; i <= m; i++)
    			for(int j = 1; j <= n; j++)
    				cin>>map[i][j];
    		v.x = 1;
    		v.y = 1;
    		v.s = 1;
    		stp[v.x][v.y] = v.s;
    		q.push(v);
    		while(1)
    		{
    			v = q.top();
    			q.pop();
    			if(v.x == m && v.y == n)
    			{
    				cout<<v.s-1<<endl;
    				break;
    			}
    			stp[v.x][v.y] = v.s;
    			for(int i = 0; i < 4; i++)
    			{
    				u.x = v.x + d[i][0];
    				u.y = v.y + d[i][1];
    				u.s = v.s + 1;
    				if(u.x > 0 && u.x <=m && u.y > 0 && u.y <= n && stp[u.x][u.y]==0 && v.k*map[u.x][u.y]==0)
    				{
    					u.k = map[u.x][u.y];
    					q.push(u);
    				}
    			}
    		}
    
    	}
    	return 0;
    } 
    

      习题6-6,UVa1600,Time:11.2

    /*
    5
    1 2
    1 3
    2 4
    2 5
    0 0 6 3 7
    */
    #include <iostream>
    #include <stdio.h>
    #include <string>
    #include <cstring>
    #include <map>
    #include <queue>
    using namespace std;
    vector<int>tree[2005];
    int num[2005];
    int cur[2005];
    void sec_dfs(int n, int f)
    {
        for(int i = 0; i < tree[n].size(); i++)
        {
            if(tree[n][i] != f)
            {
                cur[tree[n][i]] = cur[n] >> 1;
                sec_dfs(tree[n][i],n);
            }
        }
    }
     
    int fir_dfs(int n, int f)
    {
        int s = 0;
        int m = 0;
        for(int i = 0; i < tree[n].size(); i++)
        {
            if(tree[n][i] != f)
            {
                m = fir_dfs(tree[n][i], n);
                s = max(m, s);
            }
        }
        if(s == 0)  return 1;
        return 2*s;
    }
     
    int ans(int n)
    {
    	int maxx = 0;
    	int s = 0;
    	map<double,int>mul;
    	for(int i = 1; i <= n; i++)
    		if(num[i])
    		{
    			s++;
    			mul[(num[i]*1.0 / cur[i]*1.0)]++;
    			if(mul[(num[i]*1.0 / cur[i]*1.0)] > maxx)	maxx = mul[(num[i]*1.0 / cur[i]*1.0)]; 
    		}
    	return s-maxx;
    } 
     
    int main()
    {
        freopen("in.txt","r",stdin);
        int n, m;
        int s, t;
        while(cin>>n)
        {
            m = 0;
            for(int i = 1; i < n; i++)
            {
                cin>>s>>t;
                tree[s].push_back(t);
                tree[t].push_back(s);
            }
            for(int i = 1; i <= n; i++)
            {
                cin>>num[i];
                m = num[i]>m?num[i]:m;
            }
            cur[1] = fir_dfs(1,0);
            sec_dfs(1,0);
    //        for(int i = 1; i <= n; i++)
    //            cout<<cur[i]<<" ";
            cout<<ans(n)<<endl;
        }
        return 0;
    } 
    

     习题6-8,UVa806,Time:11.4

    #include <iostream>
    #include <vector>
    #include <cmath>
    #include <queue>
    using namespace std;
    struct node
    {
    	int xl, xr, yl, yr;
    	int s, t;
    	int sum;
    }num[1000005];
    priority_queue<int>ans;
    void build(int xl, int xr, int yl, int yr, int i, int cur)
    {
    	num[i].xl = xl;
    	num[i].yl = yl;
    	num[i].xr = xr;
    	num[i].yr = yr;
    	num[i].sum = (xr - xl + 1) * (yr - yl + 1);
    	num[i].s = 0;
    	num[i].t = cur;
    	if(xl == xr && yl == yr)		return;
    	int mx = (xl + xr)>>1;
    	int my = (yl + yr)>>1;
    	build(xl, mx, yl, my, 4*i - 2, 1);
    	build(mx + 1, xr, yl, my, 4*i - 1, 2);
    	build(xl, mx, my + 1, yr, 4*i, 3);
    	build(mx + 1, xr, my + 1, yr, 4*i + 1, 4);
    }
    void update(int x, int y, int i)
    {
    	if(num[i].xl == num[i].xr && num[i].yl == num[i].yr)
    	{
    		num[i].s = 1;
    		return;
    	}
    	int mx = (num[i].xl + num[i].xr)>>1;
    	int my = (num[i].yl + num[i].yr)>>1;
    	if(x <= mx && y <= my)
    	{
    		update(x, y, i*4 - 2);
    	}
    	else if(x > mx && y <= my)
    	{
    		update(x, y, i*4 - 1);
    	}
    	else if(x <= mx && y > my)
    	{
    		update(x, y, i*4);
    	}
    	else
    	{
    		update(x, y, i*4 + 1);
    	}
    	num[i].s++;
    }
    
    void dfs(int i, int way, int n)
    {
    
    	if(num[i].s == 0)	return;
    	else if(num[i].s == num[i].sum)
    	{
    		ans.push(-way);
    		return;
    	}
    	else
    	{
    		dfs(i*4 - 2, way + 1*pow(10, n), n + 1);
    		dfs(i*4 - 1, way + 3*pow(10, n), n + 1);
    		dfs(i*4, way + 2*pow(10, n), n + 1);
    		dfs(i*4 + 1, way + 4*pow(10, n), n + 1);
    	}
    }
    
    int FtoT(int x)
    {
    	x *= -1;
    	int s = 0;
    	int d = 0;
    	int k;
    	while(x)
    	{
    		k = x % 10;
    		s += k*pow(5, d++);
    		x/=10;
    	}
    	return s;
    }
    
    int main()
    {
    	freopen("in.txt","r",stdin);
    	int n, m;
    	cin>>n;
    	build(1, n, 1, n, 1, 0);
    	for(int i = 1; i <= n; i++)
    	{
    		for(int j = 1; j <= n; j++)
    		{
    			cin>>m;
    			if(m)	update(i, j, 1);
    		}
    	}
    	dfs(1, 0, 0);
    	while(ans.size())
    	{
    		cout<<FtoT(ans.top())<<" ";
    		ans.pop();
    	}
    	return 0;
    }
    

     习题6-9,UVa127,Time:11.5

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <queue>
    #include <stack>
    using namespace std;
    struct node
    {
    	char n, f;
    };
    vector<stack<node> >pokelist;
    
    bool init()
    {
    	bool flag = false;
    	
    	node v, v1, v3;
    	for(int i = 0; i < pokelist.size(); i++)
    	{
    		int xflag = false;
    		if(pokelist[i].size() == 0)	continue;
    		v = pokelist[i].top();
    		if(i >= 3)
    		{
    			v3 = pokelist[i-3].top();
    			if(v.n == v3.n || v.f == v3.f)
    			{
    				xflag = true;
    				pokelist[i].pop();
    				pokelist[i-3].push(v);
    				flag = true;				
    			}
    		}
    		if(i >= 1 && xflag == false)
    		{
    			v1 = pokelist[i-1].top();
    			if(v.n == v1.n || v.f == v1.f)
    			{
    				pokelist[i].pop();
    				pokelist[i-1].push(v);
    				flag = true;				
    			}
    		}
    		if(pokelist[i].size() == 0)
    		{
    			pokelist.erase(pokelist.begin()+i);
    			i--;
    		}	
    		if(flag)	return flag;
    	}
    
    	return flag;
    }
    int main()
    {
    	freopen("in.txt","r",stdin);
    	char poke[5];
    	node v;
    	int size;
    	for(int i = 1; i <= 52; i++)
    	{
    		stack<node>q;
    		cin>>poke;
    		cout<<poke<<" : ";
    		v.f = poke[1];
    		v.n = poke[0];
    		q.push(v);
    		pokelist.push_back(q);
    		while(init());
    	}
    	for(int i = 0; i < pokelist.size(); i++)
    		cout<<pokelist[i].size()<<" ";
    	cout<<endl;
    
    	return 0;
    } 

    习题6-11,UVa10410,Time:11.4

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    using namespace std;
    char cdfs[1005];
    char cbfs[1005];
    vector<int>dot[1005];
    void dfs(char ds[], char bs[], int len)
    {
    	if(len == 1)	return;
    	int cur[1005];
    	char dtmp[1005];
    	char btmp[1005];
    	int k, xl = 0;
    	int a, b;
    	for(int i = 0; i < len; i++)
    	{
    		cur[ds[i]-'0'] = i;
    	}
    	for(int i = 1; i < len; i++)
    	{
    		k = 0;
    		if(cur[bs[i] - '0'] > cur[bs[i+1] - '0'])
    		{
    			xl = i;
    			break;
    		}
    		a = bs[0] - '0';
    		b = bs[i] - '0';
    		dot[a].push_back(b);
    		for(int j = i; j < len; j++)
    		{
    			if(cur[bs[j] - '0'] >= cur[bs[i] - '0'] && cur[bs[j] - '0'] < cur[bs[i + 1] - '0'])
    				btmp[k++] = bs[j];
    		}
    		btmp[k++] = 0;
    		k = 0;
    		
    		for(int j = cur[bs[i] - '0']; j < cur[bs[i+1] - '0']; j++)
    			dtmp[k++] = ds[j];
    		dtmp[k++] = 0;
    		dfs(dtmp, btmp, k - 1);
    	}
    	a = bs[0] - '0';
    	b = bs[xl] - '0';
    	dot[a].push_back(b);
    	k = 0;
    	for(int j = xl; j < len; j++)
    		if(cur[bs[j] - '0'] >= cur[bs[xl] - '0'])
    			btmp[k++] = bs[j];
    	btmp[k++] = 0;
    	k = 0;
    	for(int j = cur[bs[xl] - '0']; j < len; j++)
    		dtmp[k++] = ds[j];
    	dtmp[k++] = 0;
    	dfs(dtmp, btmp, k - 1);
    }
     
    int main()
    {
    	freopen("in.txt","r",stdin);
    	int n;
    	cin>>n;
    	cin>>cdfs>>cbfs;
    	dfs(cdfs, cbfs, n);
    	for(int i = 1; i <= n; i++)
    	{
    		cout<<i<<" : ";
    		for(int j = 0; j < dot[i].size(); j++)
    		{
    			cout<<dot[i][j]<<" ";
    		}		
    		cout<<endl;
    	}
    
    	return 0;
    } 
    

    习题6-14,UVa12118,Time:11.5

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <queue>
    #include <stack>
    using namespace std;
    int main()
    {
    	freopen("in.txt","r",stdin);
    	int map[1005];
    	int v, e, t;
    	while(cin>>v>>e>>t)
    	{
    		int x, y, z = 0;
    		memset(map,0,sizeof(map));
    		for(int i = 0; i < e; i++)
    		{
    			cin>>x>>y; 
    			map[x]++;
    			map[y]++;
    		}
    		for(int i = 1; i <= v; i++)
    			if(map[i]%2)	z++;
    		cout<<z/2 + e - 1<<endl;
    	}
    	return 0;
    } 
    

      

     

  • 相关阅读:
    JavaScript之六种排序法
    实习的意义
    HTML、JS、CSS之特殊字符
    CSS之全屏背景图
    Swiper之滑块1
    (转)Android之接口回调机制
    (转)Android之自定义适配器
    反射
    对数据库事务、隔离级别、锁、封锁协议的理解及其关系的理解
    get和Post区别
  • 原文地址:https://www.cnblogs.com/you-well-day-fine/p/4067814.html
Copyright © 2011-2022 走看看