比赛链接:https://codeforces.com/contest/903
A题:
题意是给出一个整数n(1 ≤ n ≤ 100) ,要使得 3x + 7y = n (x,y ≥ 0),直接暴力就好了。
bool check = 0;
for(int i=0;i<=34;i++)
for(int j=0;j<=15;j++)
if((3*i+7*j)==n)
check = 1;
B题:
模拟。
C题:
题意是有若干个正方体,知道每一个的边长,小正方体可以放进大正方体中(没错就是套娃),求最少能套成几个正方体。
相同大小的正方体不能出现在同一个套娃中,即最终看见的正方体数为出现最多的边长长度的数量,所以开个桶就完事了。
map<int,int>q;
int main()
{
int n;cin>>n;
int m=0;
for(int i=0;i<n;i++){
int x;cin>>x;
q[x]++;
m=max(m,q[x]);
}
cout<<m;
}
D题:
题意是给出一个数组a[n]:
d
(
x
,
y
)
=
{
y
−
x
,
if
∣
x
−
y
∣
>
1
0
,
if
∣
x
−
y
∣
≤
1
,
求
∑
1
≤
i
≤
j
≤
n
d
(
a
i
,
a
j
)
d(x,y) = \begin{cases}y-x, &\text{if } |x-y|>1\\0, &\text{if } |x-y|≤1\end{cases} ,求\sum_{1≤i≤j≤n}d(a_i, a_j)
d(x,y)={y−x,0,if ∣x−y∣>1if ∣x−y∣≤1,求1≤i≤j≤n∑d(ai,aj)
易得:
∑
1
≤
i
<
k
d
(
a
i
,
a
k
)
=
a
k
×
s
−
s
u
m
(
s
为
a
k
之
前
与
a
k
绝
对
值
大
于
一
的
个
数
,
s
u
m
为
这
些
数
的
和
)
\sum_{1≤i<k}d(a_i, a_k) = a_k×s -sum(s为a_k之前与a_k 绝对值大于一的个数,sum为这些数的和)
1≤i<k∑d(ai,ak)=ak×s−sum(s为ak之前与ak绝对值大于一的个数,sum为这些数的和)
又有,
∑
1
≤
i
≤
j
≤
n
d
(
a
i
,
a
j
)
=
∑
1
≤
j
≤
n
∑
1
≤
i
<
j
d
(
a
i
,
a
j
)
\sum_{1≤i≤j≤n}d(a_i, a_j)=\sum_{1≤j≤n}\sum_{1≤i<j}d(a_i, a_j)
1≤i≤j≤n∑d(ai,aj)=1≤j≤n∑1≤i<j∑d(ai,aj)
可以在O(n)时间复杂度求出答案。
坑点:这道题卡long long的范围,用了long double才过…
#define ld long double
#define fo1(i,n) for(int i=1;i<=n;i++)
map<ld,ld>q;
ld a[N];
int main()
{
ld n;cin>>n;
ld sum=0;
fo1(i,n){
cin>>a[i];
q[a[i]]++;
sum+=a[i];
}
ld s=0;
for(int i=n;i>0;i--){
sum-=a[i];q[a[i]]--;
ld t=sum-a[i]*q[a[i]]-(a[i]-1)*q[a[i]-1]-(a[i]+1)*q[a[i]+1];
ld tt=q[a[i]]+q[a[i]-1]+q[a[i]+1];
s+=((i-1-tt)*a[i]-t);
}
cout<<fixed<<setprecision(0)<<s<<endl;
}
E题:
暴力+剪枝。