算法设计与分析作业4

有些代码是从网上看的

  • 6-20 约瑟夫环之循环链表 (10 分)
void show(struct Node *r)//show data    需要完成的函数
{
    
    if(r == NULL){
        printf("[]\n");
        return;
    }
    struct Node *t = r->next;
    printf("[%d",t->data);
    
    for(struct Node* p = t->next;p != t;p = p->next){
        printf(",%d",p->data);
    }
    
    printf("]");
}
  • 6-21 查找第K小元素(分治法) (10 分)

int Kminselect(int a[],int s,int t,int k)
{
    int n = t + 1;
    for(int i = 0;i < n;i ++)
    {
        int l = i;
        for(int j = i + 1;j < n;j ++){
            if(a[l] > a[j]){
                l = j;
            }
        }
        
        int ll = a[i];
        a[i] = a[l];
        a[l] = ll;
        
    }
    return a[k - 1];
}
  • 6-22 最大次大问题(分治法) (10 分)

void max1max2(int a[],int low,int high,int &max1,int &max2)
{
    int n = high + 1;
    
    for(int i = 0;i < n;i ++)
    {
        int l = i;
        for(int j = i + 1;j < n;j ++){
            if(a[l] > a[j]){
                l = j;
            }
        }
        
        int ll = a[i];
        a[i] = a[l];
        a[l] = ll;
    }
    
    max1 = a[n - 1];
    max2 = a[n - 2];
    
    
}
  • 6-23 二分查找 (15 分)
int BinarySearch(int a[], const int x, int n)
{
    
    int l = 0,r = n - 1;
    
    while(l < r){
        
        int mid = l + r>> 1;
        
        if(a[mid] >= x){
            r = mid;
        }else{
            l = mid + 1;
        }
    }
    
    if(a[l] != x) return -1;
    return l;
}


  • 6-24 求自定类型元素序列的中位数 (25 分)
ElementType Median(ElementType A[], int N){
	ElementType Temp;
	for (int gap = N / 2; gap > 0; gap /= 2){ //gap是每次排序分组的间隔,每次间隔缩小两倍(其他缩小办法也可以)
		for (int i = gap; i < N; i++){//相当于在同一组内采用直接插入排序
			for (int j = i - gap; j >= 0 && A[j]> A[j + gap]; j -= gap){//如果同一组内前一个元素大于相 gap个位置的元素,则两者交换位置
				Temp = A[j];
				A[j] = A[j + gap];
				A[j + gap] = Temp;
			}
		}
	}
	return A[N / 2];//返回中间元素
}
  • 6-25 大整数乘法(运算符重载) (25 分)

 
/* 请在这里填写答案 */
class BigInteger{
private:
    int big[2010];
    string a;
public:
    BigInteger(string ba=""){
        a=ba;
        for (int i = 0; i <2010 ; ++i) {
            big[i]=0;
        }
    }
    friend istream& operator>>(istream& inbig,BigInteger& bg);
    friend ostream& operator<<(ostream& outbig,BigInteger& bg);
    BigInteger operator*(BigInteger& bg){
        BigInteger rsBig;
        int jw=0,lc,sc;
        int la=this->a.size();
        int lb= bg.a.size();
        if(la==1&&stoi(this->a)==0||lb==1&&stoi(bg.a)==0){
            rsBig.a="0";
            return rsBig;
        }
        sc=la+lb-1;
        for (int i =la-1; i >=0 ; --i) {
            lc=sc;
            sc--;
            for (int j =lb-1; j >=0; --j) {
                rsBig.big[lc--]+=(jw+this->big[i]*bg.big[j])%10;
                jw=(jw+this->big[i]*bg.big[j])/10;
            }
            rsBig.big[lc]=jw;
            jw=0;
        }
        jw=0;
        int x=0;
        for (int k = la+lb-1; k >=0; --k) {
            x=(jw+rsBig.big[k])/10;
            rsBig.big[k]=(jw+rsBig.big[k])%10;
            jw=x;
        }
        int begin=(0==rsBig.big[0]?1:0);
        int st=0;
        rsBig.a.resize(la+lb+2);
        for (int l = begin; l < la+lb; ++l) {
            rsBig.a[st++]=rsBig.big[l]+'0';
        }
        rsBig.a[st]='\n';
        return rsBig;
    }
};
istream& operator>>(istream& inbig,BigInteger& bg){
    inbig>>bg.a;
    for (int i = 0; i <bg.a.size() ; ++i) {
        bg.big[i]=bg.a[i]-'0';
    }
    return inbig;
}
ostream& operator<<(ostream& outbig,BigInteger& bg){
    outbig<<bg.a;
    return outbig;
}

  • 7-21
// 我自己写的代码,不优美但是应该没啥问题
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{   
    
    int n;
    cin >> n;
    string str;
    for(int i = 1;i <= n;i ++){
        str += i + '0';
    }
    
    do
    {
        cout << str << endl;
    } while (next_permutation(str.begin(), str.end()));

}
  • 7-22
// 我自己写的代码,不优美但是应该没啥问题
#include <bits/stdc++.h>
using namespace std;


int main()
{   
    int n,m;
    set<int>s1,s2;
    cin >> n >> m;
    for(int i = 0;i < n;i ++){
        int x;
        cin >> x;
        s1.insert(x);
    }
    
    for(int i = 0;i < m;i ++){
        int x;
        cin >> x;
        if(s1.count(x)){
            s2.insert(x);
        }
    }
    
    cout << s2.size() << endl;
    
    bool flag = false;
    for(auto &x : s2){
        
        if(flag) cout << ' ';
        flag = true;
        cout << x;
    }
    
    
    return 0;
}
  • 7-23
#include <iostream>
using namespace std;
#include <vector>
struct Node{
 
	int data;
	Node*next;
};
 
int main()
{
	int n, m;
	cin >> n >> m;
 
	vector<int>res;
	Node * first = new Node;
	//first->next =nullptr;
	Node *pre = new Node;
	Node * p = new Node;
 
	pre = first;
	pre->next = p;
	p = first;
	if (n){
		pre->data = 1;
	}
	for (int i = 2; i <= n; i++)
	{
		Node * pc = new Node;
		pc->data = i;
		pc->next = nullptr;
		p->next = pc;
		p = pc;
	}
 
	p->next = pre;
 
	//cout << "pre->data = " << pre->data <<"p->next = "<<p->data<< endl;
 
	int cnt = 1;
	for (auto i = pre,j = p;n; i = i->next)
	{
 
 
		if (cnt == m)
		{
			auto pr = i;
			res.push_back(i->data);
			//cout << i->data << " ";
			j->next = i->next;
		//delete pr;
			n--;
			cnt = 0;
		}
		cnt++;
		j = i;
		//system("pause");
	}
 
	bool tf = false;
	for (auto &x : res)
	{
		if (tf)
			cout << " ";
		cout << x;
		tf = true;
	}
 
	system("pause");
	return 0;
}
  • 7-24 二分查找 (20 分)
#include <bits/stdc++.h>
using namespace std;

const int N = 1100;
int a[N];
int main()
{   
    int n;
    cin >> n;
    
    for(int i =0;i < n;i ++){
        cin >> a[i];
    }
    int x;
    cin >> x;
    
    int l = 0,r = n - 1;
    int cnt = 0;
    while(l < r){
        
        int mid = l + r + 1 >> 1;
        cnt ++;
        if(a[mid] > x){
            r = mid - 1;
        }else{
            l = mid;
        }
    }
    if(a[l] != x) l = -1;
    cout << l << endl;
    cout << cnt << endl;
    
    
    return 0;
}
  • 7-25 两个有序序列的中位数 (25 分)
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int a[N];
int b[N];
int c[N];
int main()
{   
    int n;
    cin >> n;
    for(int i = 0;i < n;i ++){
        cin >> a[i];
    }
    
    for(int i = 0;i < n;i ++){
        cin >> b[i];
    }
    int cnt = 0;
    int i,j;
    for(i = 0,j = 0;i < n && j < n;)
    {
        if(a[i] > b[j]){
            c[cnt ++] = b[j];
            j ++;
        }else{
            c[cnt ++] = a[i];
            i ++;
        }
    }
    
    for(int k = i;k < n;k ++){
        c[cnt ++] = a[k];
    }
    
    for(int k = j;k < n;k ++){
        c[cnt ++] = b[k];
    }
    
  /*  for(int i = 0;i < cnt;i ++){
        cout << c[i] << ' ';
    }*/
    
    cout << c[(n * 2 - 1) >> 1] << endl;
    
    
    return 0;
}
  • 7-26
#include <bits/stdc++.h>
using namespace std;
const int N = 11;

pair<char,char>tree[N];
int din[N];
vector<int> vec;

void bfs(int p)
{
    queue<int>q;q.push(p);
    
    while(q.size())
    {
        p = q.front();q.pop();
        if(tree[p].first == '-' && tree[p].second == '-'){
            vec.push_back(p);
        }
        
        if(tree[p].first != '-'){
            int t = tree[p].first - '0';
            q.push(t);
        }
        
        if(tree[p].second != '-'){
            int t = tree[p].second - '0';
            q.push(t);
        }
        
    }
    
    
}

int main()
{   
    int n;
    cin >> n;
    
    for(int i = 0;i < n;i ++)
    {
        char l,r;
        cin >> l >> r;
        tree[i].first = l;
        tree[i].second = r;
        if(l != '-'){
            int t = l - '0';
            din[t] ++;
        }
        if(r != '-'){
            int t = r - '0';
            din[t] ++;
        }
    }
    int root = 0;
    for(int i = 0;i < n;i ++){
        if(din[i] == 0) root = i;
    }
    
    bfs(root);
    for(int i = 0;i < vec.size();i ++){
        if(i == vec.size() - 1){
            cout << vec[i] << endl;
        }else{
            cout << vec[i] << ' ';
        }
    }
    
    return 0;
}
  • 7-27
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

int main()
{
	vector<int>vec,ans;
	LL sum = 1,sum2 = 1;
	LL x;
	while(cin >> x){
		if(x == 0){
			if(vec.size() == 0) break;
			int t = vec[vec.size() - 1];
			vec.pop_back();
			sum = sum / t;
			continue;
		}
		sum = sum * x;
		vec.push_back(x);
		
		if(sum2 < sum){
			sum2 = sum;
			ans = vec;
			
			int l = 0,r = ans.size() - 1;
			vector<int>b;
			for(int i = 0;i <= r;i ++){
			    if(ans[i] != 1){
			        l = i;
			        break;
			    }
			}
			
			for(int i = r;i > l;i --){
			    if(ans[i] != 1){
			        r = i;
			        break;
			    }
			}
		
			for(int i = l;i <= r;i ++){
			    b.push_back(ans[i]);
			}
			ans = b;
			
		}
		else if(sum2 == sum){
			if(vec.size() < ans.size()){
				ans = vec;
			}
			
			int l = 0,r = ans.size() - 1;
			vector<int>b;
			for(int i = 0;i <= r;i ++){
			    if(ans[i] != 1){
			        l = i;
			        break;
			    }
			}
			
			for(int i = r;i > l;i --){
			    if(ans[i] != 1){
			        r = i;
			        break;
			    }
			}
			
			
			for(int i = l;i <= r;i ++){
			    b.push_back(ans[i]);
			}
			ans = b;
		}
	}
	cout << sum2 << endl;
	
	int l = 0,r = ans.size() - 1;
	vector<int>b;
	for(int i = 0;i <= r;i ++){
	    if(ans[i] != 1){
	        l = i;
	        break;
	    }
	}
	
	for(int i = r;i > l;i --){
	    if(ans[i] != 1){
	        r = i;
	        break;
	    }
	}
	
	
	for(int i = l;i <= r;i ++){
	    b.push_back(ans[i]);
	}
	ans = b;
	
	for(auto &x : ans){
	    cout << x << ' ';
	}
	
	return 0;
}

/*
1 2 0 3 0 4 0 0 0

*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值