uva 11078 Open Credit System
https://vjudge.net/problem/UVA-11078
题意:
给出一个整数序列,要求找出两个位置i,j(i < j),Ai - Aj的值最大,并且输出这个最大值。
思路:
原来我考虑的是一边遍历,一边排序,求Aj - Ai的最小值,然后总的复杂度是O(NlogN),但是没有想到这样都tle了,贴上代码警示。
1 #include <stdio.h> 2 #include <algorithm> 3 using namespace std; 4 5 int a[100005]; 6 7 int main() 8 { 9 int t; 10 11 scanf("%d",&t); 12 13 while(t--) 14 { 15 int n; 16 17 scanf("%d",&n); 18 19 int ans = 100000000; 20 21 for (int i = 1;i <= n;i++) 22 { 23 scanf("%d",&a[i]); 24 } 25 26 //int maxn = a[1]; 27 28 for (int i = 2;i <= n;i++) 29 { 30 sort(a+1,a+i); 31 32 ans = min(ans,a[i] - a[i-1]); 33 } 34 35 printf("%d\n",-ans); 36 } 37 38 return 0; 39 }
后来呢,那么这个都过不了,只有用线性的时间喽,所以就动态更新这个坐标之前的最大值,那么最大值肯定是某个坐标前面的最大值静减去当前值,所以就可以O(N)得出答案。
代码:
1 #include <stdio.h> 2 #include <algorithm> 3 using namespace std; 4 5 int a[100005]; 6 7 int main() 8 { 9 int t; 10 11 scanf("%d",&t); 12 13 while(t--) 14 { 15 int n; 16 17 scanf("%d",&n); 18 19 int ans = -100000000; 20 21 for (int i = 1;i <= n;i++) 22 { 23 scanf("%d",&a[i]); 24 } 25 26 int maxn = a[1]; 27 28 for (int i = 2;i <= n;i++) 29 { 30 ans = max(maxn - a[i],ans); 31 32 maxn = max(a[i],maxn); 33 } 34 35 printf("%d\n",ans); 36 } 37 38 return 0; 39 }
康复训练中~欢迎交流!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用