码蹄杯 魔法项链 题型:找规律 难度:黄金

71 阅读1分钟

码题集OJ-最佳邻居 (matiji.net)

暴力解超时:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int a[N];
 
signed main()
{
	int n;cin>>n;
	
	int t1=0;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		t1+=a[i];
	}
	
	
	int t2=0;
	for(int i=0;i<n;i++)
	{
		for(int j=i+1;j<n;j++)
		{
		  int yu=a[i]&a[j];	
		  int huo=a[i]|a[j];
		  t2+=yu+huo; 
		}
	}
	
	cout<<t1+t2<<endl;
	return 0;
}

image.png image.png

正解

直接说结论: a&b + a|b =a+b

反推: a&b的结果无非就两种:0,1

a|b的结果无非就两种:0,1

a&b + a|b的结果无非就四种:

image.png

我们发现a&b完 和 a||b完 相加的结果 和a直接+b的结果一样.

因此a&b + a|b =a+ba&b + a|b =a+b的结论是成立.

因为题目说了 在魔法项链中,任意两颗珠子都会产生共鸣。并且 魔法项链的总魔力值是每对魔法珠子共鸣产生魔力值贡献的总和,再加上所有魔法珠子自身魔力值的总和的结果。

假设一个珠子的魔力为num,那么它与剩下的n-1个珠子都要配对(贡献魔力),那么一共就要贡献n次魔力(算上自身).

用公式表示为:nnumn*num

code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int a[N];
int ans;
signed main()
{
  int n;cin>>n;
  for(int i=0;i<n;i++)
  {
    int num;cin>>num;
    ans+=num*n;
  }

  cout<<ans;
	return 0;
}

image.png