lsnu暑假集訓第二天(排序,二分,折半,Huffman)

//A
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;


const int maxn=1e2+5; 
void solve(){
	int a[maxn];
	pair<int,int> pa[maxn];
	
	int n;
	while(cin>>n){
		if(n==0) return;
		for(int i=0;i<n;i++) cin>>a[i];
		for(int i=0;i<n;i++) pa[i]=make_pair(abs(a[i]),a[i]);
		sort(pa,pa+n);
		printf("%d",pa[n-1].second);
		for(int i=n-2;i>=0;i--) printf(" %d",pa[i].second);
		printf("\n");	
	}
}


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

//B
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;


const int maxn=4e4;

int large[16000000];
void solve(){
	int a[4][maxn];
	
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++) scanf("%d%d%d%d",&a[0][i],&a[1][i],&a[2][i],&a[3][i]);
	
	for(int i=0;i<n;i++) for(int j=0;j<n;j++) large[i*n+j]=a[0][i]+a[1][j]; 
	sort(large,large+n*n);
	long long ans=0;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			int t=a[2][i]+a[3][j];
			ans+=upper_bound(large,large+n*n,-t)-lower_bound(large,large+n*n,-t);
		}
	}
	printf("%d\n",ans);
	
}


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

/C
#include <iostream>
#include <queue>
#include <stdio.h>
using namespace std;

const int maxn=2e4; 

void solve(){
	int n;
	scanf("%d",&n);
	priority_queue<int,vector<int>,greater<int> > myheap;
	
	int t;
	for(int i=0;i<n;i++){
		scanf("%d",&t);
		myheap.push(t);
	}
	
	if(n==1){
		printf("%d\n",myheap.top());
		return;
	}
	long long  ans=0;
	while(myheap.size()>1){
		int num1=myheap.top();
		myheap.pop();
		int num2=myheap.top();
		myheap.pop();
		ans+=num1+num2;
		myheap.push(num1+num2);
	}
	printf("%lld\n",ans);
}


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

//D
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;


const int maxn=1e3+5; 
void solve(){
	char s[maxn];
	while(scanf("%s",&s)!=EOF){
		int index=0,now=0,count=0;
		
		int ans[maxn],ansnum=0;
		
		while(s[index]){
			if(s[index]=='5'){
				if(count){
					ans[ansnum++]=now;
					count=0;
					now=0;
				}
			}
			else{
				count++;
				now=now*10+s[index]-'0';
			}
			index++;
		}
		if(count) ans[ansnum++]=now;
		
		sort(ans,ans+ansnum);
		printf("%d",ans[0]);
		for(int i=1;i<ansnum;i++) printf(" %d",ans[i]);
		printf("\n");
	}
}


int main(){
	solve();
	return 0;
}
//E
#include <stdio.h>
#include <queue>
using namespace std;

struct treenode{
	int data;
	treenode *parent;
	bool operator <(treenode a) const  {  return data < a.data; }
    bool operator >(treenode a) const  {  return data > a.data; }
};

int deep(treenode* i){
	if(i->parent==NULL) return 0;
	return 1+deep(i->parent);
}


const int maxn=1e5+5;
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int m;
		scanf("%d",&m);
		char s[maxn];
		scanf("%s",&s);
		float count[26];
		for(int i=0;i<26;i++) count[i]=0;
		int index=0;
		while(s[index]){
			count[s[index]-'a']+=1;
			index++;
		}
		int a[26],anum=0;
		for(int i=0;i<26;i++) if(count[i]) a[anum++]=count[i];
		treenode base[anum*2];
		int nowbasenum=anum;
		for(int i=0;i<anum;i++){
			base[i].data=a[i];
			base[i].parent=NULL;
		}
		
		
		priority_queue<treenode*,vector<treenode*>,greater<treenode*> > que;
		for(int i=0;i<anum;i++) que.push(&base[i]);
		int ans=0;
		if(que.size()==1){
			ans=que.top()->data; 
		}
		else{
			while(que.size()>1){
				treenode* num1=que.top();
				que.pop();
				treenode* num2=que.top();
				que.pop();
				
				base[nowbasenum].data=num1->data+num2->data;
				base[nowbasenum].parent=NULL;
				num1->parent=&base[nowbasenum];
				num2->parent=&base[nowbasenum];
		
				que.push(&base[nowbasenum++]);
			}
			for(int i=0;i<anum;i++) ans+=base[i].data*deep(&base[i]);
		}
		
		if(ans<=m) printf("yes\n");
		else printf("no\n");
	}
	return 0;
}

//G
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

const int maxn=1e3+5; 

bool norepeat(int a1,int a2,int b1,int b2){
	if(a1==b1||a1==b2||a2==b1||a2==b2) return false;
	return true;
}

bool comp(const pair<int,int> &a,const pair<int,int> &b){
	return a.first<b.first;
}

pair<int,int > pa[1000005];
const int inf=1136870912;
void solve(){
	int n;
	int a[maxn];
	while(scanf("%d",&n)){
		if(n==0) break;
		for(int i=0;i<n;i++) scanf("%d",&a[i]);
		sort(a,a+n);
		int count=0;
		for(int i=0;i<n-1;i++) for(int j=i+1;j<n;j++) pa[count++]=make_pair(a[i]+a[j],a[i]); 
		
		sort(pa,pa+count,comp);
		int ans=-inf;
		for(int i=n-1;i>=1&&ans==-inf;i--){
			for(int j=i-1;j>=0&&ans==-inf;j--){
				pair<int,int> tpa=make_pair(a[i]-a[j],0);
				int l=lower_bound(pa,pa+count,tpa,comp)-pa,r=upper_bound(pa,pa+count,tpa,comp)-pa;
				for(int k=l;k<r;k++){
					if(norepeat(pa[k].second,pa[k].first-pa[k].second,a[i],a[j])){
						ans=std::max(ans,a[i]);
					}
				}
			}
		}
		if(ans==-inf) printf("no solution\n");
		else printf("%d\n",ans);
	}
}


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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章