#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;
}