洛谷刷题第二天(线性表)

这篇博客介绍了三道UVA在线判题系统的编程挑战,包括UVA101、UVA12657和UVA11988。UVA101涉及数组操作,UVA12657处理链表操作和翻转,UVA11988则关注字符串处理。博主提供了详细的解决方案和代码实现,展示了问题解决过程和关键算法思想。

UVA101:

#include<bits/stdc++.h>
using namespace std;

vector<int>block[30];
int n;

void init()
{
    cin>>n;
    for(int i=0;i<n;i++)
        block[i].push_back(i);
}

void loc(int x,int &p,int &h)//找位置
{
    for(int i=0;i<n;i++)
        for(int j=0;j<block[i].size();j++)
        {
            if(block[i][j]==x)
            {
                p=i;
                h=j;
            }
        }
}

void goback(int p,int h)//p堆>h的所有块归位
{
    for(int i=h+1;i<block[p].size();i++)
    {
        int k=block[p][i];
        block[k].push_back(k);
    }
    block[p].resize(h+1);//重置大小
}

void moveall(int p,int h,int q)//p堆>=h的所有块移动到q之上
{
    for(int i=h;i<block[p].size();i++)
    {
        int k=block[p][i];
        block[q].push_back(k);
    }
    block[p].resize(h);//重置大小
}

void solve()
{
    int a,b;
    string s1,s2;
    while(cin>>s1)
    {
        if(s1=="quit")
            break;
        cin>>a>>s2>>b;
        int ap=0,ah=0,bp=0,bh=0;
        loc(a,ap,ah);
        loc(b,bp,bh);
        if(ap==bp)
        	continue;
        if(s1=="move")//a归位
            goback(ap,ah);
        if(s2=="onto")//b归位
            goback(bp,bh);
        moveall(ap,ah,bp);
    }
}

void print()
{
    for(int i=0;i<n;i++)
    {
        cout<<i<<":";
        for(int j=0;j<block[i].size();j++)
            cout<<" "<<block[i][j];
        cout<<endl;
    }
}

int main()
{
    init();
    solve();
    print();
    return 0;
}

UVA12657:

#include<bits/stdc++.h>
using namespace std;

int r[100000+5],l[100000+5];

void init(int n) 
{
	for(int i=1;i<=n;i++)
	{
		l[i]=i-1;
		r[i]=(i+1)%(n+1);
	}
	r[0]=1;
	l[0]=n;
}

void link(int L,int R) 
{
	r[L]=R;
	l[R]=L;
}

int main()
{
	int n,m,a,x,y,k=0;
	bool flag; 		
	while(cin>>n>>m)
	{
		flag=false;
		init(n);
		for(int i=0;i<m;i++)
		{
			cin>>a;
			if(a==4)
				flag=!flag;//翻转 
			else
			{
				cin>>x>>y;
				if(a==3&&r[y]==x) swap(x,y);
				if(a!=3&&flag)
					a=3-a;
				if(a==1&&x==l[y])
					continue;
				if(a==2&&x==r[y])
					continue;
				int Lx=l[x],Rx=r[x],Ly=l[y],Ry=r[y];
				if(a==1)
				{
					link(Lx,Rx);//删除x 
					link(Ly,x);
					link(x,y);//x插入y左 
				}
				else if(a==2)
					{
						link(Lx,Rx);//删除x 
						link(y,x);
						link(x,Ry);//x插入y右
					}
					else if(a==3)
					{
						if(r[x]==y)
						{
							link(Lx,y);
							link(y,x);
							link(x,Ry);
						}
						else
						{
							link(Lx,y);//交换位置 
							link(y,Rx);
							link(Ly,x);
							link(x,Ry);
						}
					}
			}	
		}
		int t=0;
		long long sum=0;
		for(int i=1;i<=n;i++)
		{
			t=r[t];
			if(i%2==1)
				sum+=t;
		 }
		if(flag&&n%2==0)
			sum=(long long)n*(n+1)/2-sum;
		cout<<"Case "<<++k<<": "<<sum<<endl;
	}
	return 0;
 } 

UVA11988:

#include<bits/stdc++.h>
using namespace std;

void solve(string s)
{
	int len=s.length();
	list<char> text;
	list<char>::iterator it=text.begin();
	for(int i=0;i<len;i++)
	{
		if(s[i]=='[')
			it=text.begin();
		else if(s[i]==']')
				it=text.end();
			else
			{
				it=text.insert(it,s[i]);
				it++;
			}		
	}
	for(it=text.begin();it!=text.end();it++)
		cout<<*it;
	s.clear();
	cout<<endl;
 } 

int main()
{
	string s;
	while(cin>>s)
		solve(s);
	return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值