Tyvj 1007 排座椅 4次快排 VS 两次快排+维护Topk数组 贪心

#include
#include
#include
using namespace std;
#define N 1010
int Row[N],Column[N];
int TopkRow[N],TopkColumn[N];
int PosColumn[N],PosRow[N];
int main(){
	int n,m,k,l,d;
	while(scanf("%d%d%d%d%d",&m,&n,&k,&l,&d)!=EOF){
		//init
		memset(Row,0,sizeof(Row));
		memset(Column,0,sizeof(Column));
		memset(PosColumn,-1,sizeof(PosColumn));
		memset(PosRow,-1,sizeof(PosRow));
		int x1,y1,x2,y2;
		int cnt1=1,cnt2=1;
		TopkColumn[0]=0;
		PosColumn[0]=0;
		PosRow[0]=0;
		TopkRow[0]=0;
		int minn;
		while(d--){
			scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
			if(x1==x2){
				minn=min(y1,y2); 
				Column[minn]++;
				if(Column[minn]<=Column[TopkColumn[cnt1-1]]&&(PosColumn[minn]!=cnt1-1)){
					if(cnt1=0){
						if(Column[minn]<=Column[TopkColumn[cnt]]){
							break;
						}
						TopkColumn[cnt+1]=TopkColumn[cnt];
						TopkColumn[cnt]=minn;
						PosColumn[TopkColumn[cnt+1]]=PosColumn[minn];
						PosColumn[TopkColumn[cnt]]=cnt;
						cnt--;
					}
				}
			}
			else {
				minn=min(x1,x2);
				Row[minn]++;
				if(Row[minn]<=Row[TopkRow[cnt2-1]]&&(PosRow[minn]!=cnt2-1)){
					if(cnt2=0){
						if(Row[minn]<=Row[TopkRow[cnt]]){
							break;
						}
						TopkRow[cnt+1]=TopkRow[cnt];
						TopkRow[cnt]=minn;
						PosRow[TopkRow[cnt+1]]=PosRow[minn];//!!!-1
						PosRow[TopkRow[cnt]]=cnt;
						cnt--;
					}
				}
			}
		}
		sort(TopkColumn,TopkColumn+l);
		sort(TopkRow,TopkRow+k);
		for(int i=0;i

4次快排如下:

#include
#include
#include
using namespace std;
#define N 1010
struct Type{
	int num,pos;
}s1[N],s2[N];
int HashColumn[N];
int HashRow[N];
int Column[N];
int Row[N];
int cmp(Type x,Type y){
	return x.num>y.num;
}
int main(){
	int n,m,k,l,d;
	while(scanf("%d%d%d%d%d",&m,&n,&k,&l,&d)!=EOF){
		int x1,x2,y1,y2;
		int minn;
		int cnt1=0,cnt2=0;
		memset(HashColumn,-1,sizeof(HashColumn));
		memset(HashRow,-1,sizeof(HashRow));
		for(int i=1;i<=d;i++){
			scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
			if(x1==x2){
				minn=min(y1,y2);
				if(HashColumn[minn]==-1){
					s1[cnt1].num=1;
					s1[cnt1].pos=minn;
					HashColumn[minn]=cnt1++;
				}
				else {
					s1[HashColumn[minn]].num++;
				}
			}
			else {
				minn=min(x1,x2);
				if(HashRow[minn]==-1){
					s2[cnt2].num=1;
					s2[cnt2].pos=minn;
					HashRow[minn]=cnt2++;
				}
				else {
					s2[HashRow[minn]].num++;
				}
			}
		}
		sort(s1,s1+cnt1,cmp);
		sort(s2,s2+cnt2,cmp);
		int cnt=0;
		while(cnt
本题在维护Topk数组的时候出现了很多小问题。。。

你可能感兴趣的:(贪心)