大佬求助!!!交流的喜悦(二)

4. 交流的喜悦(二)

题目ID:7717100分

最新提交:

Wrong Answer

0 分

历史最高:

Wrong Answer

0 分

时间限制: 1000ms

空间限制: 262144kB

题目描述

时间:1s 空间:256M

题目描述:

有n个人,每个人都拥有一个喜悦值,接下来,任意三个人之间会进行一次交流,任意三个人交流所获得的贡献为三个人的喜悦值的和,求任意三个人交流所获得的贡献之和

输入格式:

第一行一个整数n

接下来n行,每行一个整数a,表示第i个人的喜悦值

输出格式:

按题目描述输出

样例输入1:

3

2

3

4

样例输出1:

9

约定:

n<=1000

1<=a<=10^100

我的代码:

#include<bits/stdc++.h>
using namespace std;
int n,sul,su[100005];
int sl,s[100005];
string sy;
long long C(int n,int m){
    long long k=1;
    for(int i=1;i<=n;i++){
        k=k*i;
    }
    for(int i=1;i<=m;i++){
        k=k/i;
    }
    for(int i=1;i<=(n-m);i++){
        k=k/i;
    }
    return k;

}
string sum;
int main(){
	cin>>n;
	cin>>sum;
	sul=sum.size();
	for(int i=0;i<sul;i++){
		su[sul-i-1]=sum[i]-'0';
	}
//		for(int j=0;j<sul;j++)
//		{
//			cout<<su[j];
//		}
	for(int i=1;i<n;i++){
		memset(s,0,sizeof(s));
		cin>>sy;
		sl=sy.size();
		for(int j=0;j<sl;j++){
			s[sl-j-1]=sy[j]-'0';
		}
//		for(int j=0;j<sl;j++)
//		{
//			cout<<s[j];
//		}
		sul=max(sul,sl);
		for(int j=0;j<sul;j++){
			su[j]=s[j]+su[j]; 
			if(su[j]>=10){
				su[j+1]++;
				su[j]-=10;
			}
		}
		
//		for(int j=0;j<sul;j++)
//		{
//			cout<<su[sul-j-1]<<"---";
//		}
	}
//	for(int i=0;i<sul;i++){
//		cout<<su[sul-1-i];
//	}
	int cs=C(n-1,2);
  //  cout<<cs<<endl;
	for (int i=0;i<=sul;++i){
		su[i]=su[i]*cs;	      
	}      
	sul=sul+4;                           //原理进行高精乘
    for (int i=0;i<sul;++i){
    	if (su[i]>9){
			su[i+1]+=su[i]/10;
			su[i]%=10;
		}//进位
	}
	while (su[sul-1]==0&&sul>1){
		sul--;//判断位数
    }
	for(int i=0;i<sul;i++){
		cout<<su[sul-1-i];
	}
 	return 0;
}
在此处键入或粘贴代码
1 个赞
  • 处理大数加法:由于题目给出的喜悦值可能是非常大的数,所以直接用字符串处理大数加法。我们将每个人的喜悦值以字符串形式存储,然后通过大数加法来累加所有人的喜悦值。
  • 使用组合公式:直接计算 C(n,3)C(n, 3)C(n,3) 的值,这可以通过简单的组合公式来计算。
1 个赞

问题分析
你要求计算任意三个人的喜悦值之和。对于给定的
𝑛
n 个人和他们的喜悦值,我们需要求解所有可能的三人组合所产生的贡献的和。每个三人组合的贡献为这三个人的喜悦值之和。

给定:

𝑎
1
,
𝑎
2
,

,
𝑎
𝑛
a
1

,a
2

,…,a
n

表示每个人的喜悦值。
对于每一组三个人,我们要计算他们的喜悦值之和,并求出所有三人组合的贡献之和。

1 个赞

#include<bits/stdc++.h>
using namespace std;

int n;
vector joys;

long long C(int n, int m) {
// 组合数计算函数实现(如上述修正后的代码)
}

// 高精度加法函数,用于将两个大整数字符串相加
string addStrings(const string& num1, const string& num2) {
string result;
int i = num1.size() - 1;
int j = num2.size() - 1;
int carry = 0;

while (i >= 0 || j >= 0 || carry > 0) {
    int sum = carry;
    if (i >= 0) {
        sum += num1[i] - '0';
        i--;
    }
    if (j >= 0) {
        sum += num2[j] - '0';
        j--;
    }

    carry = sum / 10;
    result.push_back(sum % 10 + '0');
}

reverse(result.begin(), result.end());
return result;

}

int main() {
cin >> n;

for (int i = 0; i < n; ++i) {
    string joy;
    cin >> joy;
    joys.push_back(joy);
}

string totalContribution = "0";  // 用于存储最终的贡献之和

// 三层嵌套循环遍历所有三个人的组合
for (int i = 0; i < n; ++i) {
    for (int j = i + 1; j < n; ++j) {
        for (int k = j + 1; k < n; ++k) {
            // 将三个人的喜悦值相加
            string contribution = addStrings(joys[i], joys[j]);
            contribution = addStrings(contribution, joys[k]);

            // 将当前组合的贡献累加到总贡献中
            totalContribution = addStrings(totalContribution, contribution);
        }
    }
}

cout << totalContribution << endl;

return 0;

}