连续整数--全国模拟(一)
[编程题] 连续整数
时间限制:1秒
空间限制:32768K
牛牛的好朋友羊羊在纸上写了n+1个整数,羊羊接着抹除掉了一个整数,给牛牛猜他抹除掉的数字是什么。牛牛知道羊羊写的整数神排序之后是一串连续的正整数,牛牛现在要猜出所有可能是抹除掉的整数。例如:
10 7 12 8 11 那么抹除掉的整数只可能是9
5 6 7 8 那么抹除掉的整数可能是4也可能是9
输入描述:
输入包括2行:
第一行为整数n(1 <= n <= 50),即抹除一个数之后剩下的数字个数
第二行为n个整数num[i] (1 <= num[i] <= 1000000000)
输出描述:
在一行中输出所有可能是抹除掉的数,从小到大输出,用空格分割,行末无空格。如果没有可能的数,则输出mistake
输入例子:
2 3 6
输出例子:
mistake
解题思路:因为加上去掉的数是一个连续序列,所以想到记录min、max,以及n个数的和sum,求从min到max连续序列和sum2 val = sum2- sum,如果val在min、max区间内,则输出val,否则输出min-1 和max+1 其中如果min-1 <=0 就只输出max+1 ,然后否则输出mistake
1 #include <iostream> 2 #include <limits.h>//INT_MIN INT_MAX 3 4 using namespace std; 5 6 int main() 7 { 8 int n; 9 while(cin>>n) 10 { 11 int a[n]; 12 for(int i=0;i<n;i++) 13 { 14 cin>>a[i]; 15 } 16 int min = INT_MAX; 17 int max = INT_MIN; 18 int sum = 0; 19 for(int i=0;i<n;i++) 20 { 21 sum += a[i]; 22 if(a[i] > max) 23 { 24 max = a[i]; 25 } 26 if(a[i] < min) 27 { 28 min = a[i]; 29 } 30 } 31 int sum2 = ((min+max)*(max-min+1))/2; 32 int val = sum2 - sum; 33 if(val > min && val < max) 34 { 35 cout<<val<<endl; 36 } 37 else if(val == 0) 38 { 39 if(min-1 >0) 40 cout<<min-1<<" "<<max+1<<endl; 41 else 42 cout<<max+1<<endl; 43 } 44 else 45 { 46 cout<<"mistake"<<endl; 47 } 48 } 49 return 0; 50 }