蓝桥杯2080、2120、2377、17134
求和
问题描述
给定 nn 个整数 a1,a2,⋅⋅⋅,ana1,a2,⋅⋅⋅,an ,求它们两两相乘再相加的和,即:
S=a1⋅a2+a1⋅a3+⋯+a1⋅an+a2⋅a3+⋯+an−2⋅an−1+an−2⋅an+an−1⋅an
输入格式
输入的第一行包含一个整数 nn。
第二行包含 nn 个整数 a1,a2,⋯,ana1,a2,⋯,an。
输出格式
输出一个整数 S,表示所求的和。请使用合适的数据类型进行运算。
暴力做法(不能全部通过)
#include <iostream> using namespace std; const int N=200005; typedef long long LL; int n; int a[N]; int main() { scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&a[i]); } LL sum=0; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ sum+=a[i]*a[j]; } } printf("%lld",sum); return 0; }优化:
a1*a2+a1*a3+......+a1*an+a2*a3+a2*a4+......an−1*an
=a1*(a2+a2+......+an)+a2*(a3+a4+......+an)+......an−1*an
=a1*(s-a1)+a2*(s-a1-a2)+......+an*(s-a1-a2-...-an-1)
#include <iostream> using namespace std; const int N=200005; typedef long long LL; int n; int a[N]; LL s=0,ans=0; int main() { scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&a[i]); s+=a[i]; } for(int i=0;i<n;i++){ s-=a[i]; ans+=a[i]*s; } printf("%lld",ans); return 0; }纸张尺寸
问题描述
在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm ×× 841mm, 将 A0 纸 沿长边对折后为 A1 纸, 大小为 841mm ×× 594mm, 在对折的过程中长度直接取 下整 (实际裁剪时可能有损耗)。将 A1 纸沿长边对折后为 A2 纸, 依此类推。
输入纸张的名称, 请输出纸张的大小。
输入格式
输入一行包含一个字符串表示纸张的名称, 该名称一定是 A0、A1、A2、 A3、A4、A5、A6、A7、A8、A9 之一。
输出格式
输出两行,每行包含一个整数,依次表示长边和短边的长度。
#include <iostream> using namespace std; int main() { int l = 1189, w = 841, a = 0; scanf("A%d", &a); for(int i = 0; i < a; i++) { int tmp = l; l = w; w = tmp / 2; } printf("%d\n%d", l, w); return 0; }特殊年份
问题描述
今年是 2021 年, 2021 这个数字非常特殊, 它的千位和十位相等, 个位比 百位大 1 ,我们称满足这样条件的年份为特殊年份。
输入 5 个年份, 请计算这里面有多少个特殊年份。
输入格式
输入 5 行, 每行一个 4 位十进制数 (数值范围为 1000 至 9999), 表示一个 年份。
输出格式
输出一个整数, 表示输入的 5 个年份中有多少个特殊年份。
字符串,py思想,把他看做是只含有数字的字符串(数组),直接暴力,简洁
#include<bits/stdc++.h> using namespace std; int ans=0; int main(){ string s; for(int i=1;i<=5;i++){ cin>>s; if(s[0]==s[2]&&s[1]==s[3]-1) ans++; } cout<<ans; return 0; }玩具
问题描述
小明的妈妈给他买了 nn 个玩具,但是为了同时考察他的智力,只给了他 2×n2×n 个零件,第ii个零件的重量为 wiwi(1≤i≤2×n1≤i≤2×n)。
其中任意两个零件都可以拼接成一个玩具,这个玩具的权重就等于拼接所用的 两个零件的重量的乘积两个零件的重量的乘积。小明的妈妈希望小明能够使用这2×n2×n 个零件拼接出 nn 个玩具(每个零件必须使用且只能用一次),使得所有玩具的权重的和最小。小明希望你帮帮他计算出最小的权重和。
输入描述
输入共 22 行。
第一行为一个正整数 nn。
第二行为 2×n2×n 个由空格隔开的整数 w1,w2,...,w2×nw1,w2,...,w2×n。
输出描述
输出共 11 行,一个整数。
贪心加双指针 排序,最大值与最小值相乘的和
#include <bits/stdc++.h> using namespace std; typedef long long LL; int main() { int n; cin>>n; vector<LL> a(2*n); LL cnt=0; for(int i=0;i<2*n;i++) cin>>a[i]; sort(a.begin(),a.end()); int i=0; int j=2*n-1; while(i<j){ cnt+=a[i]*a[j]; i++; j--; } cout<<cnt; return 0; }