4.12 | 学习笔记

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;
}

  

posted @ 2019-04-12 17:42  MissCold  阅读(116)  评论(0编辑  收藏  举报