• 算法竞赛入门经典(第八章)


    习题8-1 Uva1149  11.8  

    #include <iostream>
    #include <algorithm>
    using namespace std;
    int main()
    {
    //	freopen("in.txt","r",stdin);
    	int T;
    	cin>>T;
    	while(T--)
    	{
    	    int n, m, mi;
    	    int w[100005];
    	    int num;
    	    int l, r;
    	    cin>>n>>m;
    	    for(int i = 1; i <= n; i++)
    	    {
    	        cin>>w[i];
    	    }
    	    sort(w+1, w+n+1);
    	    l = 1 , r = n;
    	    num = 0;
    	    while(l<=r)
    	    {
    	        mi = m - w[r--];
    	        if(r==l)
    	        {
    	        	num++;
    	        	break;
    	        }
    	        if(mi - w[l] >= 0)    	l++;
    			num++;
    	    }
    	    cout<<num<<endl;		
    	}
    
        return 0;
    } 
    

      

      习题8-2 Uva1610  11.8

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <string>
    using namespace std;
    string qz(string a, string b)
    {
    	string ans;
    	int len = min(a.length(), b.length());
    	if(a==b)
    	{
    		return a;
    	}	
    	
    	for(int i = 0; i < len; i++)
    	{
    		if(a[i] == b[i])	ans = ans + a[i];
    		else
    		{
    			ans = ans + (char)(a[i] + 1);
    			return ans;
    		}
    	}
    	return a;
    } 
    int main()
    {
    	freopen("in.txt","r",stdin);
    	string stc[105];
    	int n; 
    	cin>>n;
    	for(int i = 1; i <= n; i++)
    		cin>>stc[i];
    	sort(stc + 1, stc + n + 1); 
    	if(n%2)
    	{
    		n = n / 2;
    		cout<<stc[n]<<endl;
    	}
    	else
    	{
    		string ans = qz(stc[n/2],stc[n/2+1]);
    		cout<<ans<<endl;
    	}
    	return 0;
    } 
    

      习题8-3 Uva12545  11.8

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <string>
    using namespace std;
    int main()
    {
    	freopen("in.txt","r",stdin);
    	int n0, n1, nx;
    	n0 = n1 = nx = 0;
    	char s[105];
    	char t[105];
    	cin>>s>>t;
    	int len = strlen(s);
    	for(int i = 0; i <= len; i++)
    	{
    		if(s[i] != t[i])
    		{
    			switch(s[i])
    			{
    				case '1':	n1++;	break;
    				case '0':	n0++;	break;
    				case '?':	nx++; 	break;
    			}
    		}
    	}
    	cout<<nx+max(n1,n0)<<endl;
    	return 0;
    } 
    

      习题8-4 Uva11491  11.8

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <string>
    using namespace std;
    int main()
    {
    	freopen("in.txt","r",stdin);
    	char num[100005];
    	int n, m, d;
    	cin>>n>>d;
    	cin>>num;
    	m = 0;
    	for(int i = 0; i <= d + 1; i++)
    	{
    		if(i != d + 1)
    		{
    			if(num[i] > num[m])		m = i;
    		}
    		else
    		{
    			if(d == n)	break;
    			cout<<num[m];
    			i = m;
    			m = i + 1;
    			d++;
    			
    		}
    	}
    	return 0;
    } 
    

      习题8-6 Uva1611  11.9

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <cassert>
    #include <algorithm>
    using namespace std;
    #define N 10100
    int num[N];
    int cur[N];
    int li[N], ri[N];
    int stp = 0;
    void swapk(int l, int r)
    {
        li[stp] = l;
        ri[stp++] = r;
        int k = (l + r + 1)>>1;
        for(int i = k; i <= r; i++)
        {
            int z = num[l];
            num[l] = num[i];
            num[i] = z;
            cur[num[i]] = i;
            cur[num[l]] = l;
            l++;
        }
        return;
    }
    
    int main() {
        freopen("in.txt","r",stdin);
        int n;
        cin>>n;
        for(int i = 1; i <= n; i++)
        {
            cin>>num[i];
            cur[num[i]] = i;
        }
        for(int i = 1; i <= n; i++)
        {
    
            if(cur[i] == i) continue;
            else if(cur[i]*2 <= i+n)
            {
                swapk(i, cur[i] - i - 1 + cur[i]);
            }
            else
            {
                if((i%2)^(n%2))
                {
                    swapk(i, n);
                }
                else
                {
                    swapk(i, n-1);
                }
                i--;
            }
        }
        cout<<stp<<endl;
        for(int i = 0; i < stp; i++)
            cout<<li[i]<<" "<<ri[i]<<endl;
        for(int j  = 1; j <= n; j++)
            cout<<num[j]<<" ";
        cout<<endl;
        return 0;
    }
    

      习题8-7 Uva11925  11.10

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <cassert>
    #include <algorithm>
    #include <vector>
    #include <cmath>
    using namespace std;
    vector<int>num;
    bool pd(int n)
    {
    	for(int i = 0; i < n; i++)
    	{
    		if(num[i] != i+1)	return true;
    	}
    	return false;
    } 
    int main() {
        freopen("in.txt","r",stdin);
        int n, m; 
        int h=0;
        cin>>n;
        for(int i = 1; i <= n; i++)
        {
        	cin>>m;
        	num.push_back(m);
        }
        while(pd(n))
        {
        	int cur = 0;
    		if(num[1] < num[0])	cur = 1;
    		if(num[1]==1 && num[0]==n)	cur = 0;
    		if(num[1]==n && num[0]==1)	cur = 1;
    		if(cur)	cout<<"1";
    		m = num[cur];
        	num.erase(num.begin()+cur);
        	cout<<"2";
        	num.push_back(m);
    //    	cout<<endl;
    //    	for(int i = 0; i < n; i++)
    //    		cout<<num[i]<<" ";
    //    	cout<<endl;
        }
        cout<<endl;
        return 0;
    }
    

      习题8-11 Uva1615  11.10

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    struct node
    {
    	double x, y;
    }dot[100005];
    bool cmp(node a, node b)
    {
    	return a.y<b.y;
    }
    int main()
    {
    	freopen("in.txt","r",stdin);
        int n; 
        double d;
        cin>>n;
        for(int i = 0; i < n; i++)
    		cin>>dot[i].x>>dot[i].y;
    	
    	for(int i = 0; i < n; i++)
    	{
    		dot[i].x -= sqrt(d*d - dot[i].y*dot[i].y);
    		dot[i].y += sqrt(d*d - dot[i].y*dot[i].y);
    	}
    	sort(dot, dot+n, cmp);
    	int cur = 0;
        int tmp = 1;
    	for(int i = 0; i < n; i++)
        {
        	if(dot[i].x > dot[cur].y)
        	{
        		cur = i;
        		tmp++;
        	}
        }
        cout<<tmp<<endl;
        return 0;
    }
    

      习题8-13 Uva10570  11.10

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <string>
    using namespace std;
    int tmp[1005];
    int num[1005];
    int cur[1005];
    int n, m;
    int main()
    {
    	freopen("in.txt","r",stdin);
    	m = 0; 
    	cin>>n;
    	for(int i = 1; i <= n; i++)
    	{
    		cin>>num[i];
    	}
    	int ans = 1000;
    	for(int i = 1; i <= n; i++)
    	{
    		int key = 0;
    		for(int j = 1; j <= n; j++)
    		{
    			tmp[j] = num[j + i - 1];
    			cur[tmp[j]] = j;
    		}
    		for(int j = 1; j <= n; j++)
    		{
    			if(cur[j] != j)
    			{
    				cur[tmp[j]] = cur[j];
    				key++;
    			}
    		}
    		if(key < ans)	ans = key;
    	}
    	cout<<ans;
    	return 0;
    } 
    

      习题8-14 Uva10570  11.10

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <string>
    using namespace std;
    struct node
    {
    	int x, y;
    }num[100005];
    int n, m = 0;
    bool cmp(node a, node b)
    {
    	return a.x<b.x;
    }
    
    bool pd(int x)
    {
    	int cur = 0;
    	for(int i = 1; i <= n; i++)
    	{
    		if(cur < num[i].x)	cur = num[i].x + x;
    		else 	cur += x;
    		if(cur > num[i].y)	return false;
    	}
    	return true;
    }
    
    int main()
    {
    	freopen("in.txt","r",stdin);
    	cin>>n;
    	for(int i = 1; i <= n; i++)
    	{
    		cin>>num[i].x>>num[i].y;
    		num[i].x*=2;
    		num[i].y*=2;
    		m = m > (num[i].y - num[i].x)?m:(num[i].y - num[i].x);
    	}
    	sort(num+1, num+1+n, cmp);
    	int l = 0;
    	int r = m;
    	while(r - l != 1)
    	{
    		if(pd((l+r)>>1))	l = (l+r)>>1;
    		else	r = (l+r)>>1;
    	}
    	cout<<l<<endl;
    	return 0;
    } 
    

    习题8-21 Uva1621  11.13  

    /*感谢SLO,提供的代码,我菜是想了好久都没想到好办法,得到指点真是太好了
    构造的题感觉和数学题目差不多了,都是要找一种方法来解决问题
    这道题目就是先把3步的走完,然后在走1,2步的,牛逼啊
    深受影响啊
    */
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int ans[5005*3],n;
    int main(){
    
        int T;
        while(scanf("%d",&T)==1)while(T--){
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            n=0;
            int p=0;
            ans[n++]=0;
            if((c+1)%3==0){
                for(int i=0;i<(c+1)/3;++i)  ans[n++]=(p+=3);
                ans[n++]=--p;--a;
                for(int i=1;i<(c+1)/3;++i)  ans[n++]=(p-=3);
                ans[n++]=--p;--a;
                for(int i=0;i<(c+1)/3;++i)  ans[n++]=(p+=3);
            }
            if((c+2)%3==0){
                for(int i=0;i<(c+2)/3;++i)  ans[n++]=(p+=3);
                ans[n++]=(p-=2);--b;
                for(int i=1;i<(c+2)/3;++i)  ans[n++]=(p-=3);
                ans[n++]=++p;--a;
                for(int i=1;i<(c+2)/3;++i)  ans[n++]=(p+=3);
                ans[n++]=(p+=2);--b;
            }
            if(c%3==0){
                for(int i=0;i<c/3;++i)  ans[n++]=(p+=3);
                ans[n++]=++p;--a;
                for(int i=0;i<c/3;++i)  ans[n++]=(p-=3);
                ans[n++]=++p;--a;
                for(int i=0;i<c/3;++i)  ans[n++]=(p+=3);
            }
            for(;a>1;--a)ans[n++]=++p;
            for(int i=0;i<(b+1)/2;++i)  ans[n++]=(p+=2);
            if(b%2==0)ans[n++]=++p;
            else ans[n++]=--p;
            for(int i=b&1;i<(b+1)/2;++i)    ans[n++]=(p-=2);
            for(int i=0;i<n;++i)printf(i<n-1?"%d ":"%d
    ",ans[i]);
        }
        return 0;
    }

    习题8-24 Uva10366  11.12

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <string>
    #include <windows.h>
    using namespace std;
    int l, r; 
    int ml, mr;
    int xl, xr;
    int li[1005], ri[1005];
    void sscanf()
    {
    	int id;
    	ml = mr = 0;
    	for(int i = l; i <= r; i+=2)
    	{
    		if(i < 0)
    		{
    			id = (-i)/2;
    			scanf("%d",&li[id]);
    			if(li[id] >= ml)
    			{
    				ml = li[id];
    				xl = id;
    			}
    		}
    		else{
    			id = i/2;
    			scanf("%d",&ri[id]);
    			if(ri[id] > mr)
    			{
    				mr = ri[id];
    				xr = id;
    			}
    		}
    	}
    }
    
    int solve()
    {
    	int k, tmp;
    	l = (-l)/2;
    	r = r/2;
    	int al, ar;
    	if(ml == mr)
    	{
    		k = 0;
    		tmp = li[l];
    		for(int i = l; i > xl; i--)
    		{
    			k+=tmp;
    			tmp = max(tmp,li[i-1]);
    		}
    		al = k;
    		tmp = ri[r];
    		k = 0;
    		for(int i = r; i > xr; i--)
    		{
    			k+=tmp;
    			tmp = max(tmp,ri[i-1]);
    		}
    		ar = k;
    		return (xl+xr+1)*ml+min(ar,al);
    	}
    	else if(ml > mr)
    	{
    		tmp = ri[r];
    		k = 0;
    		for(int i = r; i > 0; i--)
    		{
    			k+=tmp;
    			tmp = max(tmp,ri[i-1]);
    		}
    		for(int i = 0; i < l; i++)
    		{
    			k+=tmp;
    			if(li[i]>tmp)	break;
    		}
    		return k;
    	}	
    	else
    	{
    		tmp = li[l];
    		k = 0;
    		for(int i = l; i > 0; i--)
    		{
    			k+=tmp;
    			tmp = max(tmp,li[i-1]);
    		}
    		for(int i = 0; i < r; i++)
    		{
    			k+=tmp;
    			if(ri[i]>tmp)	break;
    		}
    		return k;
    	}	
    }
    
    int main()
    {
    	freopen("in.txt","r",stdin);
    	while(cin>>l>>r)
    	{
    		sscanf();
    		int ans = solve();
    		cout<<ans<<endl;
    	}
    	return 0;
    } 
    

      习题8-23 Uva1623  11.20

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    struct edge
    {
    	int s, t;
    }num[1000005];
    int link[100005];
    int tmp[100005];
    bool cmp(edge a, edge b)
    {
    	if(a.s == b.s)	return a.t<b.t;
    	return a.s < b.s;
    }
    int main()
    {
    	freopen("in.txt","r",stdin);
    	int T;
    	cin>>T;
    	while(T--)
    	{
    		memset(link, 0, sizeof(link));
    		bool flag = false;
    		int n, m, mi = 0;
    		int ni = 0;
    		cin>>n>>m;
    		for(int i = 1; i <= m; i++)
    		{
    			cin>>tmp[i];
    			if(tmp[i])
    			{
    				num[mi].s = link[tmp[i]];
    				num[mi].t = i;
    				mi++;
    				link[tmp[i]] = i;
    			}
    		}
    		sort(num, num+mi, cmp);
    		for(int i = 1; i <= m; i++)
    		{
    			if(tmp[i])				continue;
    			if(tmp[i] < num[ni].s)	continue;
    			if(ni == mi)			break;
    			if(i > num[ni].s && i < num[ni].t)
    			{
    				tmp[i] = 0 - tmp[num[ni].t];
    				ni++;
    			}
    			else
    			{
    				flag = true;
    				break;
    			}
    		}
    		if(flag || ni != mi)	cout<<"NO"<<endl;
    		else
    		{
    			for(int i = 1; i <= m; i++)
    			{
    				if(tmp[i] <= 0)	cout<<0-tmp[i]<<" ";
    			}
    			cout<<endl;
    		}		
    	}
    
    	return 0;	
    }
    

      习题8-18 Uva1619  11.20

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int li[100005];
    int ri[100005];
    int tmp[100005];
    int sum[100005];
    int main()
    {
    	freopen("in.txt","r",stdin);
    	int n, maxx = 0;
    	int al, ar;
    	cin>>n;
    	for(int i = 1; i <= n; i++)
    	{
    		cin>>tmp[i];
    		sum[i] = sum[i-1] + tmp[i];
    	}
    	for(int i = 1; i <= n; i++)
    	{
    		int l, r;
    		l = r = i;
    		while(tmp[l-1] >= tmp[i] && l > 1)	l--;
    		li[i] = l;
    		while(tmp[r+1] >= tmp[i] && r < n)	r++;
    		ri[i] = r;
    	}
    	for(int i = 1; i <= n; i++)
    	{
    		
    		if(maxx < (tmp[i] * (sum[ri[i]] - sum[li[i]-1])))
    		{
    			al = li[i];
    			ar = ri[i];
    			maxx = (tmp[i] * (sum[ri[i]] - sum[li[i]-1]));
    		}
    	}
    	cout<<maxx<<endl<<al<<" "<<ar<<endl;;
    	return 0;	
    }
    

      

  • 相关阅读:
    托管资源和非托管资源
    无法启动IIS EXpress Web服务器
    SQL 最后一天及第一天
    amchart amline中配置文件amline_settings.xml文件中的配置说明
    SpringBoot添加拦截器
    Lombok插件
    SpringBoot配置访问静态资源
    SpringBoot自动配置原理
    yaml基本格式
    属性文件之SpringBoot注入
  • 原文地址:https://www.cnblogs.com/you-well-day-fine/p/4083874.html
Copyright © 2020-2023  润新知