实力评估
文件 IO比赛题目
时间限制: 1000MS空间限制: 256MB
题目描述
本次 新赛道CSP-J/S十一连测 一共有 n 名同学参加,对于每个同学用一个整数 ai 表示他的实力系数。
为了更深入地评估本次比赛的精彩程度,我们认为同学 i 和同学 j 的实力差距是他们实力系数差值绝对值的平方,即 ∣ai−aj∣2。
现在想要计算本次 新赛道CSP-J/S十一连测 的精彩程度,即在全部同学中选择两位同学,计算他们的实力差距。把所有选择情况中的实力差距计算一个总和并输出。
具体而言,需要输出 ∑i=1n−1∑j=i+1n∣ai−aj∣2 。
输入格式
输入的第一行包含一个正整数 n,表示一共有多少位同学。
输入的第二行包含 n 个整数 ai,表示每个同学的实力系数。
输出格式
输出共一行,包含一个整数,表示本次 新赛道CSP-J/S十一连测 的精彩程度。
样例输入 1
3 2 8 4
样例输出 1
56
样例输入 2
5 -5 8 9 -4 -3
样例输出 2
950
提示/说明
样例 1 解释
∣2−8∣2+∣2−4∣2+∣8−4∣2=36+4+16=56。
样例 2 解释
∣−5−8∣2+∣−5−9∣2+∣−5−(−4)∣2+∣−5−(−3)∣2+∣8−9∣2+∣8−(−4)∣2+∣8−(−3)∣2+∣9−(−4)∣2+∣9−(−3)∣2+∣−4−(−3)∣2=169+196+1+4+1+144+121+169+144+1=950
数据规模与约定
- 对于 40% 的数据,保证 n≤1000,∣ai∣≤10。
- 对于 100% 的数据,保证 n≤1×105,∣ai∣≤1000。
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
long long n, a[MAXN], sum1 = 0, sum2 = 0;
int main(){
freopen("evaluation.in","r",stdin);
freopen("evaluation.out","w",stdout);
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i];
sum1 += a[i];
sum2 += a[i] * a[i];
}
long long ans = n * sum2 - sum1 * sum1;
cout << ans << endl;
return 0;
}
简单的乘法
文件 IO比赛题目
时间限制: 1000MS空间限制: 512MB
题目描述
王老师正在研究乘法。
王老师有一个序列 a1,a2,...,an ,王老师希望从中选出其中 x1,x2,...,xm 使得 (((x1×c1+x2)×c2+x3)...+xm)×cm 尽可能大
输入格式
第一行两个整数 n,m 。
第二行 n 个整数 ai 。
第三行 m 个小数 ci。
输出格式
一个小数,保留1位小数
样例输入 1
5 3 10 20 40 80 30 -1.1 0.9 1.02
样例输出 1
108.2
样例输入 2
见下发大样例
样例输出 2
见下发大样例
提示/说明
【子任务】
对于30%的数据,1≤n≤5
对于另外30%的数据,ci>0
对于100%的数据,1≤m≤n≤105,0≤ai≤105,∣ci∣≤2,保证最后结果小于1018,建议使用long double进行运算
代码
#include<bits/stdc++.h>
#define db long double
using namespace std;
const int N=1e5+5;
int n,m,a[N];
db b[N];
int main() {
freopen("multi.in","r",stdin);
freopen("multi.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) {
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
for(int i=1;i<=m;i++) {
scanf("%Lf",&b[i]);
}
for(int i=m-1;i;i--) {
b[i]=b[i]*b[i+1];
}
sort(b+1,b+m+1);
int l=m+1;
for(int i=1;i<=m;i++) {
if(b[i]>0) {
l=i; break;
}
}
db ans=0;
for(int i=1;i<l;i++) {
ans+=b[i]*a[i];
}
for(int i=l;i<=m;i++) {
ans+=b[i]*a[n-m+i];
}
printf("%.1Lf\n",ans);
return 0;
}
基于1的算术
文件 IO比赛题目
时间限制: 1000MS空间限制: 256MB
题目描述
王老师想要将正整数 n 表示为一些加数的和,其中每个加数可正可负,但都是只包含数字 1 的整数。例如,他可以将 121 表示为 121=111+11+(−1) 。
请你帮助他找到这样的和中所需数字 1 的最小数量。
输入格式
第一行输入一个整数 n。其中 1≤n<1015。
输出格式
输出所需的 1 的最小数量。
样例输入 1
121
样例输出 1
6
样例输入 2
114514
样例输出 2
32
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> x;
ll dfs(int p, ll n)
{
if (p < 0)
return 0;
ll L = dfs(p - 1, n % x[p]) + (n / x[p]) * (p + 1);
ll R = dfs(p - 1, abs(n % x[p] - x[p]) % x[p]) + (n / x[p] + (n % x[p] != 0)) *
(p + 1);
return min(L, R);
}
int main(){
freopen("based.in","r",stdin);
freopen("based.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);
ll n;
cin >> n;
x.push_back(1);
for (int i = 1; i < 17; i++)
x.push_back(x.back() * 10 + 1);
cout << dfs(16, n) << endl;
}
买二送一
文件 IO比赛题目
时间限制: 1000MS空间限制: 512MB
题目描述
商店里总共有n件商品,他们有价值wi。
王老师打算买K个礼盒,每个礼盒中包含了两件商品,在王老师的死缠烂打下,商店同意每个礼盒中多加一件赠品,但是赠品的价值不能高于两件正品。
礼盒是用来送的,所以王老师认为礼盒的外观很重要,他定义不和谐值为礼盒中两件商品价值差的绝对值,即∣wi−wj∣。
王老师希望所有礼盒的不和谐值的和最小。
输入格式
第一行两个整数n,K。
第二行n个整数wi。
输出格式
一个整数,表示最小的不和谐值。
样例输入 1
6 2 8 1 2 3 5 6
样例输出 1
3
样例输入 2
见下发大样例
样例输出 2
见下发大样例
提示/说明
样例解释:
一个礼盒是1 2 3,另一个礼盒是5 6 8
【数据范围】
对于30%的数据,1≤n≤10。
对于70%的数据,1≤n≤300
对于100%的数据,1≤n≤3000,1≤3×K≤n,1≤wi≤106。
代码:
#include<bits/stdc++.h>
#define ll long long
const ll INF=1e18;
using namespace std;
const int N=5005;
int n,m,a[N];
ll f[N][N];
bool ex(int i,int j) {
return i>=j*3;
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+n+1);
for(int i=3;i<=n;i++) {
for(int j=1;j<=m&&ex(i,j);j++) {
f[i][j]=f[i-2][j-1]+(a[i]-a[i-1]);
if(ex(i-1,j)) f[i][j]=min(f[i][j],f[i-1][j]);
}
}
cout<<f[n][m];
return 0;
}
1665

被折叠的 条评论
为什么被折叠?



