5 条题解

  • 1
    @ 2025-4-19 22:02:28

    #include #include #include #include using namespace std; priority_queuedgd;//大根堆 priority_queue<int,vector,greater >xgd;//小根堆 int main() { int p,m,count; scanf("%d",&p); while(p--) { while(dgd.size()) dgd.pop();//清空 while(xgd.size()) xgd.pop();//清空 int x,cnt=0; scanf("%d%d",&count,&m); printf("%d %d\n",count,m/2+1); for(int i=0;i<m;i++) {

      scanf("%d",&x);
      if(xgd.empty())
        xgd.push(x);
      else
      {
        if(x>xgd.top())
          xgd.push(x);
        else
          dgd.push(x);
        while(xgd.size()<dgd.size())
        {
          xgd.push(dgd.top());
          dgd.pop();
        }
        while(xgd.size()>dgd.size()+1)
        {
          dgd.push(xgd.top());
          xgd.pop();
        }
      }
      if((i+1)&1)
      {
        cnt++;
        printf("%d ",xgd.top());
        if(!(cnt%10))
          printf("\n");
      }
    }
    printf("\n");
    

    } return 0; }

    • 1
      @ 2021-8-7 18:35:25

      C++ :

      #include<iostream>
      #include<cstdio>
      #include<queue>
      #include<vector>
      using namespace std;
      priority_queue<int>dgd;//大根堆
      priority_queue<int,vector<int>,greater<int> >xgd;//小根堆
      int main()
      {
        int p,m,count;
        scanf("%d",&p);
        while(p--)
        {
          while(dgd.size())
            dgd.pop();//清空
          while(xgd.size())
            xgd.pop();//清空
          int x,cnt=0;
          scanf("%d%d",&count,&m);
          printf("%d %d\n",count,m/2+1);
          for(int i=0;i<m;i++)
          {
            
            scanf("%d",&x);
            if(xgd.empty())
              xgd.push(x);
            else
            {
              if(x>xgd.top())
                xgd.push(x);
              else
                dgd.push(x);
              while(xgd.size()<dgd.size())
              {
                xgd.push(dgd.top());
                dgd.pop();
              }
              while(xgd.size()>dgd.size()+1)
              {
                dgd.push(xgd.top());
                xgd.pop();
              }
            }
            if((i+1)&1)
            {
              cnt++;
              printf("%d ",xgd.top());
              if(!(cnt%10))
                printf("\n");
            }
          }
          printf("\n");
        }
        return 0;
      }
      
      
      • 0
        @ 2025-7-30 13:11:37
        #include <queue>
        #include <vector>
        
        using namespace std;
        
        // 定义比较函数,用于创建最小堆(因为priority_queue默认是最大堆)
        struct CompareMinHeap {
            bool operator()(int a, int b) {
                return a > b; // 小顶堆:如果a > b,则a的优先级更低,会被放到后面
            }
        };
        
        // 按格式打印中位数序列
        void printMedians(const vector<int>& medians, int count) {
            int index = 0; // 当前输出的中位数索引
            
            // 按每行10个的格式输出
            while (index < count) {
                for (int i = 0; i < 10 && index < count; ++i, ++index) {
                    cout << medians[index] << " "; // 输出当前中位数
                }
                cout << endl; // 换行
            }
        }
        
        int main() {
            int P; // 数据集个数
            cin >> P;
        
            // 处理每个数据集
            for (int p = 0; p < P; ++p) {
                int datasetNumber; // 数据集编号
                int M; // 数据集中元素个数
                
                // 读取数据集编号和元素个数
                cin >> datasetNumber >> M;
        
                vector<int> numbers; // 存储当前数据集的所有数字
                
                // 直接读取M个整数
                for (int i = 0; i < M; ++i) {
                    int num;
                    cin >> num;
                    numbers.push_back(num);
                }
        
                priority_queue<int> max_heap; // 最大堆(存储较小的一半元素)
                priority_queue<int, vector<int>, CompareMinHeap> min_heap; // 最小堆(存储较大的一半元素)
                vector<int> medians; // 存储中位数结果
        
                // 遍历所有数字,动态维护中位数
                for (int i = 0; i < numbers.size(); ++i) {
                    int num = numbers[i]; // 当前处理的数字
                    
                    // 将数字插入合适的堆中
                    if (max_heap.empty() || num <= max_heap.top()) {
                        max_heap.push(num); // 插入最大堆(较小的一半)
                    } else {
                        min_heap.push(num); // 插入最小堆(较大的一半)
                    }
        
                    // 调整堆的大小,保持平衡
                    // 平衡条件:max_heap的大小最多比min_heap大1,或两者相等
                    if (max_heap.size() > min_heap.size() + 1) {
                        // 如果max_heap太大,将堆顶元素移到min_heap
                        min_heap.push(max_heap.top());
                        max_heap.pop();
                    } else if (min_heap.size() > max_heap.size()) {
                        // 如果min_heap太大,将堆顶元素移到max_heap
                        max_heap.push(min_heap.top());
                        min_heap.pop();
                    }
        
                    // 当已处理的数字个数为奇数时,计算并存储中位数
                    if ((i + 1) % 2 == 1) {
                        if (max_heap.size() > min_heap.size()) {
                            medians.push_back(max_heap.top()); // 中位数在max_heap的堆顶
                        } else {
                            medians.push_back(min_heap.top()); // 中位数在min_heap的堆顶
                        }
                    }
                }
        
                // 输出结果
                cout << datasetNumber << " " << medians.size() << endl; // 数据集编号和中位数个数
                printMedians(medians, medians.size()); // 按格式打印中位数序列
            }
        
            return 0;
        }
        
        
        
        • 0
          @ 2025-3-29 18:57:24

          #include #include #include #include using namespace std; priority_queuedgd;//大根堆 priority_queue<int,vector,greater >xgd;//小根堆 int main() { int p,m,count; scanf("%d",&p); while(p--) { while(dgd.size()) dgd.pop();//清空 while(xgd.size()) xgd.pop();//清空 int x,cnt=0; scanf("%d%d",&count,&m); printf("%d %d\n",count,m/2+1); for(int i=0;i<m;i++) {

            scanf("%d",&x);
            if(xgd.empty())
              xgd.push(x);
            else
            {
              if(x>xgd.top())
                xgd.push(x);
              else
                dgd.push(x);
              while(xgd.size()<dgd.size())
              {
                xgd.push(dgd.top());
                dgd.pop();
              }
              while(xgd.size()>dgd.size()+1)
              {
                dgd.push(xgd.top());
                xgd.pop();
              }
            }
            if((i+1)&1)
            {
              cnt++;
              printf("%d ",xgd.top());
              if(!(cnt%10))
                printf("\n");
            }
          }
          printf("\n");
          

          } return 0; }

          • -1
            @ 2022-10-15 19:43:41
            #include<cstring>
            #include<algorithm>
            #define  N  11000
            using  namespace  std;
            struct  fuck
            {
            	int  x,y;
            }a[N];
            inline  bool  cmp(fuck  x,fuck  y){return  x.x<y.x;}
            struct  node
            {
            	int  l,r,x/*权值*/;
            }b[N];
            void  del(int  x)
            {
            	b[b[x].l].r=b[x].r;
            	b[b[x].r].l=b[x].l;
            }
            int  n,be[N];
            int  list[N],top;
            int  main()
            {
            	int  T;scanf("%d",&T);
            	while(T--)
            	{
            		top=0;
            		int  t;scanf("%d%d",&t,&n);
            		for(int  i=1;i<=n;i++)
            		{
            			scanf("%d",&a[i].x);
            			a[i].y=i;
            			b[i].l=i-1;b[i].r=i+1;
            		}
            		sort(a+1,a+n+1,cmp);
            		for(int  i=1;i<=n;i++)be[a[i].y]=i,b[i].x=a[i].x;//确定其在链表中的位置 
            		int  ans=n/2+1,l=n/2/*左边有多少个数字*/,r=n/2/*右边有多少个数字*/;
            		for(int  i=n;i>=1;i--)//按顺序删除 
            		{
            			if(i%2==1)
            			{
            				if(l<r)
            				{
            					ans=b[ans].r;l++;r--;
            				}
            				else  if(l>r)
            				{
            					ans=b[ans].l;l--,r++;
            				}
            				list[++top]=b[ans].x;
            			}
            			if(be[i]==ans)//刚好卡在中位数的位置
            			{
            				if(l>r)ans=b[ans].l,l--,r++;
            				else  if(l<=r)ans=b[ans].r,l++,r--;
            			}
            			if(be[i]>ans)r--;
            			else  l--;
            			del(be[i]);
            		}
            		//后面就是输出的问题了。
            		printf("%d %d\n",t,n/2+1);
            		int  now=0;
            		for(int  i=top;i>=1;i--)
            		{
            			now++;
            			if(now>10)
            			{
            				now-=10;
            				printf("\n");
            			}
            			printf("%d",list[i]);
            			if(now!=10)printf(" ");
            		}
            		printf("\n");
            	}
            	return  0;
            }
            
            
            • 1

            信息

            ID
            18
            时间
            1000ms
            内存
            128MiB
            难度
            3
            标签
            递交数
            249
            已通过
            130
            上传者