Java教程

五一训练包 水题

本文主要是介绍五一训练包 水题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

g-7水题题解:https://vjudge.net/contest/436484#problem/G

题意为找出存在于b数组中的a数组,b数组比a数组多两个数,一个数为a数组的和,另一个数为无关的数。

我的思路一开始局限了,所以正确思路应该是将b数组先求和(记得注意数字范围),然后排序。排序之后能找到两个较大值,就又两种判断,第一种,用和减去最大值,如果刚好等于倒数第二个数的两倍,那a数组就是前n个;第二种,就是在前n+1个数里看能否找出一个数,用和剪掉之后刚好等于最大数的两倍,如果能找到就标记该数,输出n+1数组中剩下的n个数,否则输出-1。理论存在,代码开始。

这是我的代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 long long a[200005];
 4 int main(){
 5     int t;
 6     cin>>t;
 7     while(t--){
 8         int n;
 9         long long a1=0,b1=0,max1=0,max2=0,sum=0,t=0,c;
10         cin>>n;
11         for(int i=0;i<n+2;i++) {
12             cin>>a[i];
13             sum+=a[i];
14         }
15         sort(a,a+n+2);
16         max1=a[n+1];
17         max2=a[n];
18         int flag=0;
19         if(sum-max1==max2*2) {
20             for(int i=0;i<n;i++) cout<<a[i]<<" ";
21         }
22         else {
23             for(int i=0;i<=n;i++)
24                 if(sum-a[i]==max1*2) {
25                     t=a[i];
26                     c=1;
27                     flag=1;
28                     break;
29                 }
30             if(flag==1){
31                 for(int i=0;i<=n;i++){
32                     if(a[i]==t&&c>0) c--;
33                     else cout<<a[i]<<" ";
34                 }
35             }            
36             else printf("-1");
37         }
38         cout<<endl;
39         memset(a,0,sizeof a);
40     } 
41     return 0;
42 }

好了,冲冲冲!!!!!

这篇关于五一训练包 水题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!