NYOJ----776删除元素
删除元素
时间限制:1000 ms | 内存限制:65535 KB
描述
题意很简单,给一个长度为n的序列,问至少删除序列中多少个数,使得删除后的序列中的最大值<= 2*最小值
输入
多组测试数据,每组测试数据包含两行。
第一行一个整数n( n <= 10^5),序列中元素的个数。
第二行依次输入n个数a1,a2……an,(1 <= ai <=
10^9)以空格分开。
输出
输出占一行,至少要删除数的个数。
样例输入
6
5 4 3 3 8 6
样例输出
1
思路:先对n个数排序,然后从前往后删除元素Min,同时用二分求出原集合大于2*Min的数的个数,从而可以确定每轮满足题意而删除元素的个数,比较可得最小值,时间复杂度O(nlogn)
#include <stdio.h> #include <stdlib.h> #define M 100000//是10^5次方 struct test{ int n,ans,*num,i,tmp,l,r; void init() { ans = M; num = (int *)malloc(sizeof(int)*(n)); for(i=0;i<n;i++) scanf("%d",&num[i]); } int deletenum() { QuickSort(num,0,n-1);//升序 for(i=0;i<n;i++) { //binarysearch l = i,r = n; while(l<r) { tmp = (l+r)/2; if(num[tmp] > 2*num[i]) r = tmp; else{ l = tmp + 1; } } if(n-r+i < ans)//是n-r+i且小于 ans = n-r+i; } return ans; } void QuickSort(int *num,int p,int r) { int q; if(p<r) { q = partition(num,p,r); QuickSort(num,p,q-1);//q-1 QuickSort(num,q+1,r); } } int partition(int *num,int p,int r) { int i = p,j = r+1; int x = num[p]; while(1) { while(num[++i] < x && i < r);//i < r while(num[--j] > x); if(i >= j) break; swap(num,i,j); } swap(num,p,j); return j; } void swap(int *num,int i,int j) { num[i] = num[j] + num[i] - (num[j] = num[i]); } }test; int main() { while(~scanf("%d",&test.n))//多组测试数据 { test.init(); printf("%d\n",test.deletenum()); } return 0; }
参照:http://blog.csdn.net/lyhvoyage/article/details/12884653
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 2025成都.NET开发者Connect圆满结束
· 在 VS Code 中,一键安装 MCP Server!
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 后端思维之高并发处理方案
· 千万级大表的优化技巧