SWUST OJ題解


SWUST OJ 3:A BUG

一句話題解:簡單種類並查集

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define N 2010

int flag;
int n,m;
int f[N];
int w[N];

int Find(int x)
{
    if(x!=f[x]) f[x]=Find(f[x]);
    return f[x];
}
void UN(int x,int y)
{
    x=Find(x);
    y=Find(y);
    if(x>y) f[x]=y;
    if(x<y) f[y]=x;
}
int main()
{
    int T,iCase=1;
    scanf("%d",&T);
    while(T--){
        flag=0;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            f[i]=i;
            w[i]=0;
        }
        while(m--){
            int a,b;
            scanf("%d%d",&a,&b);
            if(!w[a] && !w[b]){
                w[a]=b;
                w[b]=a;
            }
            else if(w[a] && !w[b]){
                w[b]=a;
                UN(b,w[a]);
            }
            else if(!w[a] && w[b]){
                w[a]=b;
                UN(a,w[b]);
            }
            else if(w[a] && w[b]){
                if(Find(a)==Find(b)) flag=1;
                else{
                    UN(a,w[b]);
                    UN(b,w[a]);
                }
            }
        }
        printf("Scenario #%d:\n",iCase++);
        if(flag)
            printf("Suspicious bugs found!\n");
        else
            printf("No suspicious bugs found!\n");
    }
    return 0;
}

SWUST OJ 334:神奇的數字

思路:字符串處理,用C++11的stoi轉化string為int類型即可,很方便

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
	int i,j;
	string x,y;
	string a;
	cin>>a;
	for(i=0;i<a.length();i++)
	{
		if(a[i]!='|')
		{
			x+=a[i];
		}
		else break;
	}
	for(j=i+1;j<a.length();j++)
	{
	    y+=a[j];
	}
	sort(x.begin(),x.end());
	sort(y.begin(),y.end());
	int x1=stoi(x);
	int y1=stoi(y);
	int sum=x1+y1;
	cout<<sum<<endl;
}

SWUST OJ 1011:二叉排序樹的實現和查找

思路:先創建create,然后search查找,理解BST就很簡單,可以看看算法筆記或者大話數據結構的概念很容易入門!
二叉排序樹的左子樹要小於等於根節點,右子樹要大於等於根節點,左右子樹又是BST,我們每次只能對二叉樹的左右子樹的一個進行遞歸遍歷

/****二叉排序樹BST****/
#include<iostream>
const int maxn=100;
using namespace std;
int n,sum;
int a[maxn];
struct node
{
	int data;
	struct node*lc;
	struct node*rc;
};
//插入 
void  insert(node* &root,int x)
{
	if(root==NULL)//空樹 
	{
		root=new node;
		root->data=x;
		root->lc=root->rc=NULL;//這一步不能忘記,必須左右子樹為NULL,不然無法進行下一步創建節點
		return; 
	}
	if(root->data==x)
	{
		return;
	}
	else if(x<root->data)
	{
		insert(root->lc,x);
	}
	else
	{
		insert(root->rc,x);
	}
} 
//創建
node* create(int a[],int n)
{
	node* root=NULL;
	for(int i=0;i<n;i++)
	{
		insert(root,a[i]);
	 } 
	 return root;
 } 
void serach(node* root,int m)
{
 if(root==NULL)
{
 	sum=-1;
 	return;
}
if(root->data==m)
{
	sum++;
}	
else if(root->data>m)
{
	sum++;
	serach(root->lc,m);
}
else
{
	sum++;
	serach(root->rc,m);
}
}
int main()
{
	node* root;
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	cin>>a[i];
	int m;
	cin>>m;
	root=create(a,n);
	serach(root,m);
	cout<<sum;
}

SWUST OJ 1015:堆排序算法

思路:貌似只是建立一個小根堆,沒有涉及到一趟堆排序

#include<iostream>
#include<algorithm>
using namespace std;
int head[100],n;
void downhead(int low,int high)
{
	int i=low,j=i*2;
	while(j<=high)
	{
		if(j+1<=high&&head[j+1]<head[j])
		{
			j=j+1;
		}
		if(head[i]>head[j])
		{
			swap(head[i],head[j]);
			i=j;
			j=i*2;
		}
		else
		{
			break;
		}
	}
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>head[i];
	}
	for(int i=n/2;i>=1;i--)
	{
		downhead(i,n);//創建堆 
	}
	/*for(int i=n;i>1;i--)
	{
		swap(head[i],head[1]);
		downhead(1,i-1);
        break;
	}*/
	for(int i=1;i<=n;i++)
	{
		cout<<head[i]<<" ";
	}
}

SWUST OJ 1242:考研崽兒

一句話題解:錯排問題,網上搜一下,簡單遞歸實現就行,數據開到long long

#include<iostream>//錯排問題 
using namespace std;
long long f(int m)
{ 
	if(m==1)  return 0;
	if(m==2)  return 1;
	else 
	{
	return (m-1)*(f(m-2)+f(m-1));
    }
}
int main()
{
	int n,m;
	cin>>n;
	while(n--)
	{
		cin>>m;
		cout<<f(m)<<endl;
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM