2020.3.15

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<algorithm>
#include<string.h>
using namespace std;
string s;
int main(){
	int n;
	vector<int> v1,v;
	vector<int>::iterator it;
	scanf("%d",&n);
	while(n--){
		cin>>s;
		if(s=="Push"){
			int temp;
			scanf("%d",&temp);
			v1.push_back(temp);
			it=lower_bound(v.begin(),v.end(),temp);
			// 第一个大于等于所要查找的元素的地址
			// 二分查找 
			v.insert(it,temp);  
		}
		else if(s=="Pop"){
			if(v1.size()==0)
			 printf("Invalid\n");
			else{
				it=lower_bound(v.begin(),v.end(),v1[v1.size()-1]);
				v.erase(it);
				printf("%d\n",v1[v1.size()-1]);
				v1.pop_back(); 
			}
		}
		else if(s=="PeekMedian"){
			if(v1.size()==0)
			{
				printf("Invalid\n");
				continue;
			}
			else if(v1.size()%2==0){
				printf("%d\n",v[v1.size()/2-1]);
			}
			else if(v1.size()%2==1){
				printf("%d\n",v[v.size()/2]);
			}
		} 
	}
	return 0;
} 

在这里插入图片描述
01背包问题
在这里插入图片描述

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int dp[10010],w[10010];
bool choice[10010][10010];
int cmp1(int a,int b){
	return a>b;
}
int main(){
	int n,m;
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)
	 scanf("%d",&w[i]);
	sort(w+1,w+n+1,cmp1);
	for(int i=1;i<=n;i++){
		for(int j=m;j>=w[i];j--){
			if(dp[j]<=dp[j-w[i]]+w[i]){
				choice[i][j]=true;
				dp[j]=dp[j-w[i]]+w[i];
			}
		}
	}
	if(dp[m]!=m) printf("No Solution");
	else{
		vector<int> arr;
		int v=m,index=n;
		while(v>0){
			if(choice[index][v]==true){
				arr.push_back(w[index]);
				v-=w[index]; 
			}
			index--;
		}
		for(int i=0;i<arr.size();i++){
			if(i) printf(" ");
			printf("%d",arr[i]);
		}
	}
	return 0;
}

在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
#include<algorithm>
using namespace std;
int father[1010],hobby[1010],cluster[1010];
bool cmp(int a,int b){
	return a>b;
}
int find(int x){
	while(x!=father[x])
	 x=father[x];
	return x;
}
void Union(int a,int b){
	int findA=find(a);
	int findB=find(b);
	if(findA!=findB)
	 father[findA]=findB;
}
int main(){
	int i,j,n,m,k,t,cnt;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	 father[i]=i;
	for(i=1;i<=n;i++){
		scanf("%d:",&m);
		for(j=0;j<m;j++){
			scanf("%d",&k);
			if(hobby[k]==0)
			 hobby[k]=i;
			Union(i,find(hobby[k]));
		}
	}
	for(i=1;i<=n;i++)
	 cluster[find(i)]++;
	cnt=0;
	for(i=1;i<=n;i++){
		if(cluster[i])
		 cnt++;
	} 
	printf("%d\n",cnt);
	sort(cluster,cluster+n+1,cmp);
	for(i=0;i<cnt;i++){
		if(i) printf(" ");
		printf("%d",cluster[i]);
	}
	return 0;
}

在这里插入图片描述
在这里插入图片描述

//三维数组 
#include<bits/stdc++.h>
using namespace std;
int n,m,l,t;
int mp[66][1300][130];
bool vis[66][1300][130];
int dir[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
struct node{
	int x,y,z;
	node(int x1,int y1,int z1):x(x1),y(y1),z(z1){}
};
int bfs(int x,int y,int z){
	queue<node> q;
	q.push(node(x,y,z));
	vis[x][y][z]=true;
	int cnt=0;
	while(!q.empty()){
		node u=q.front();
		q.pop();
		cnt++;
		for(int i=0;i<6;i++){
			int xx,yy,zz;
			xx=dir[i][0]+u.x;
			yy=dir[i][1]+u.y;
			zz=dir[i][2]+u.z;
			if(xx>=0&&xx<l&&yy>=0&&yy<n&&zz>=0&&zz<m&&!vis[xx][yy][zz]&&mp[xx][yy][zz])
			{
				vis[xx][yy][zz]=true;
				q.push(node(xx,yy,zz));
			}
		}
	}
	if(cnt>=t) return cnt;
	return 0;
}
int main(){
	scanf("%d %d %d %d",&n,&m,&l,&t);
	for(int i=0;i<l;i++)
	 for(int j=0;j<n;j++)
	  for(int k=0;k<m;k++)
	   scanf("%d",&mp[i][j][k]);
	int sum=0;
	for(int i=0;i<l;i++)
	 for(int j=0;j<n;j++)
	  for(int k=0;k<m;k++)
	    if(!vis[i][j][k]&&mp[i][j][k])
	     sum+=bfs(i,j,k);
	printf("%d\n",sum);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值