1.最小向量点积
#include<bits/stdc++.h> using namespace std; int n,t,tmp; int a[1001],b[1001]; int main() { cin>>t; for(int i=0;i<t;i++) { cin>>n;tmp=0; for(int j=0;j<n;j++)cin>>a[j]; for(int j=0;j<n;j++)cin>>b[j]; sort(a,a+n),sort(b,b+n); for(int j=0;j<n;j++) tmp+=a[j]*b[n-j-1]; cout<<"case #"<<i<<": "<<tmp<<endl; } return 0; }
2.连续正整数问题
个人想法是判读“中间数”,连续正整数之和有两种情况,奇数个数的和(有一个“中间数”),或者偶数个数的和(两个连续“中间数”,和必为奇数);
若是奇数个数的和,比如21=6+7+8,也就是中间数为7,这时候需要判断左边界是否大于零;
若是偶数个数的和,比如30=6+7+8+9,中间数为7和8,同样判断左边界是否大于零;
个人代码:
#include<bits/stdc++.h> using namespace std; int n,t,tmp; int cnt(int n) { int cnt=0; for(int i=2;i<n;i++) if(n%i==0) { tmp=n/i; if(tmp%2) if((i-((tmp-1)/2))>=1)cnt++; if(i%2) if(((i+1)/2-tmp)>=1)cnt++; } if(n%2)cnt++; return cnt; } int main() { cin>>t; for(int i=0;i<t;i++) { cin>>n; cout<<"case #"<<i<<": "<<cnt(n)<<endl; } return 0; }
但是由于思路比较混乱,自己做了一个小时,最终结果也不是很理想,参考学长代码如下(转载自https://www.cnblogs.com/flower-233/p/9114258.html):
#include<bits/stdc++.h> using namespace std; int n,cnt; int a[500]; int i,j,k; int main() { cin>>n; for(i=0;i<n;++i)cin>>a[i]; for(i=0;i<n;++i)for(j=i+1;j<n;++j)for(k=j+1;k<n;++k){ if(i==j||i==k||j==k)continue; if(__gcd(a[i],a[j])==1&&__gcd(a[i],a[k])==1 &&__gcd(a[j],a[k])==1)++cnt; if(__gcd(a[i],a[j])!=1&&__gcd(a[i],a[k])!=1 &&__gcd(a[j],a[k])!=1)++cnt; } cout<<cnt<<endl; return 0; }