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<<":\n"<<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<<":\n"<<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;
}