2 条题解
-
0
这是第一种解法,时间复杂度是
#include<bits/stdc++.h> using namespace std; int main(){ int n,a[53],num[105],cnt=0; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) num[++cnt]=a[i]+a[j]; sort(num+1,num+cnt+1); int ans=0; for(int i=1;i<=cnt;i++){ for(int j=i+1;j<=cnt;j++){ if(num[i]==num[j]){ num[j]=1e9; ans++; } } } sort(num+1,num+cnt+1); cout<<cnt-ans<<endl; for(int i=1;i<=cnt-ans;i++) cout<<num[i]<<" "; return 0; }
这是第二种解法,时间复杂度也是不过相比第一段代码在会少一层for循环
#include<bits/stdc++.h> using namespace std; int main(){ int n,a[53],num[105],cnt=0; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) num[++cnt]=a[i]+a[j]; sort(num+1,num+cnt+1); int ans=cnt; for(int i=1;i<ans;i++){ if(num[i]==num[i+1]){ num[i]=1e9; cnt--; } } sort(num+1,num+ans+1); cout<<cnt<<endl; for(int i=1;i<=cnt;i++) cout<<num[i]<<" "; return 0; }
-
0
#include<bits/stdc++.h> using namespace std; /* 数组计数法 1、循环所有的数对 2、使用r数组来统计哪些数出现过 */ int a[60],r[30]; int n, c = 0;//c:统计出现过的数有几个 int main() { cin >> n; for(int i = 1; i <= n; i++){ cin >> a[i]; } //循环所有的数对 for(int i = 1; i <= n; i++){ for(int j = i+1; j <= n; j++){ r[a[i]+a[j]]++; //如果a[i]+a[j]这个数是第一次出现 if(r[a[i]+a[j]] == 1){ c++; } } } cout << c << endl; //循环输出出现过的数 //任意从1~13中找2个数相加,和是2~26范围的数 for(int i = 2; i <= 26; i++){ if(r[i] != 0){ cout << i << " "; } } return 0; }
- 1
信息
- ID
- 331
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- 1
- 标签
- 递交数
- 38
- 已通过
- 28
- 上传者