#include <iostream> #include <vector> #include <algorithm> #include <set> using namespace std; int main() { int n; set<int> set; cin >> n; int temp; for (int i = 0; i < n; i++) { cin >> temp; set.insert(temp); } if (set.size() >= 2) { cout << *(++set.rbegin()) << endl; } else { cout << *set.begin() << endl; } // 所有数相同 system("pause"); return 0; }
#include <bits/stdc++.h> using namespace std; int partation(int nums[], int lo, int hi) { if(lo == hi) return lo; int pivot = nums[lo]; while(lo < hi) { while(lo < hi && nums[hi] >= pivot) hi--; if(lo < hi) nums[lo] = nums[hi]; while(lo < hi && nums[lo] <= pivot) lo++; if(lo < hi) nums[hi] = nums[lo]; } nums[lo] = pivot; return lo; } int main() { int n; cin >> n; int nums[n]; memset(nums, 0, sizeof(nums)); for(int i = 0; i < n; ++i) { cin >> nums[i]; } int lo = 0, hi = n - 1; while(lo < hi) { //利用快排的思想 int idx = partation(nums, lo, hi); if(idx == n - 2) { cout << nums[idx] << endl; break; } else if(idx > n - 2) hi = idx - 1;//这里不能原地更新hi = idx如果有重复的数就不动了 else lo = idx + 1; } return 0; }
简单的题目,问题是测试用例有一些特殊,题目给出N个数,可是第二行可能输入不标准,给出不足N个数字,如 12
2 3 5 6 8 ,输出应该是6,但是由于不足12个数字,会一直从缓冲区读8,读入就是 2 3 5 6 8 8 8 8 8···,所以结果会输出8,所以每次操作最后清零,缓冲区读入就是0,不影响了,(因为存在负数,最好是将缓冲区数字置为最小值,本题测试用例过去了,我就不改了)。
代码
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n ,a = 0; vector<int> arr; cin>>n; for(int i = 0; i < n; i++) { cin>>a; arr.push_back(a); a = 0; } sort(arr.begin(),arr.end()); cout<<arr[arr.size()-2]; return 0; }
#include <iostream> #include <vector> using namespace std; int divide(vector<int> &nums,int left,int right) { int temp=nums[left]; do { while(left<right&&nums[right]>=temp) right--; if(left<right) { nums[left]=nums[right]; left++; } while(left<right&&nums[left]<=temp) left++; if(left<right) { nums[right]=nums[left]; right--; } } while(left!=right); nums[left]=temp; return left;//这里如果是return temp,正确率20%,搞不懂 } int main() { int numbers,num; cin>>numbers; vector<int> nums(numbers); for(int i=0;i<numbers;i++) { cin>>num; nums[i]=num; } int left=0,right=numbers-1; int pos=divide(nums,left,right); while(pos!=numbers-2) { if(pos<numbers-2) { left=pos+1; pos=divide(nums,left,right); } else { right=pos-1; pos=divide(nums,left,right); } } cout<<nums[pos]; return 0; }
import java.util.Arrays; import java.util.Scanner; public class Main { public static int secBigest(int [] array) { if(array == null || array.length <= 1) return 0; Arrays.sort(array); int len = array.length; return array[len-2]; } public static void main (String [] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); int []a = new int[n]; for(int i=0; i<n; i++){ a[i] = scan.nextInt(); } System.out.println(secBigest(a)); } }这个为啥是百分之八十啊???
#include<bits/stdc++.h> #define frp(i,a,b) for(int i = a; i <= b; i++) usingnamespacestd; intn,a[100010]; inlinevoidget_ready( ) { scanf("%d", &n); } inlinevoidsolve(){ frp(i,1,n) scanf("%d", &a[i]); intmx,ans; frp(i,1,n){ if(a[i]>=ans && a[i]<mx){ ans = a[i]; } elseif(a[i]>=ans){ ans = mx; mx = a[i]; } } printf("%d\n",ans); } intmain( ) { get_ready( ); solve( ); return0; } |