5 条题解
-
4
直接奉上代码
#include <iostream> #include <cstring> #include <algorithm> using namespace std; struct T { int money,id; } ; bool cmp(T a,T b) { return a.money < b.money; } int n,b[200005],c1[200005],c2[200005],rk[200005]; T a[200005]; int main() { cin >> n; for(int i = 1;i <= n+1;i++) cin >> a[i].money,a[i].id = i; for(int i = 1;i <= n;i++) cin >> b[i]; sort(a+1,a+n+1+1,cmp); sort(b+1,b+n+1); for(int i = 1;i <= n;i++) c1[i] = c1[i-1] + max(a[i].money-b[i],0); for(int i = n+1;i >= 1;i--) c2[i] = c2[i+1] + max(a[i].money-b[i-1],0); for (int i = 1;i <= n+1;i++) rk[a[i].id] = i; for (int i = 1;i <= n+1;i++) cout << c1[rk[i]-1] + c2[rk[i]+1] << " "; return 0; }
-
2
@洋葱头极限压缩流解密:
已AC
#include <iostream> #include <cstring> #include <algorithm> using namespace std; struct T { int money; int id; }; bool cmp(T a,T b) { return a.money < b.money; } int main(void) { register int n,*b,*c1,*c2,*rk; register T *a; cin >> n; a = new T[n+3]; b = new int[n+3]; c1 = new int[n+3]; memset(c1,0,(n+3)*sizeof(int)); c2 = new int[n+3]; memset(c2,0,(n+3)*sizeof(int)); rk = new int[n+3]; for(register int i = 1;i <= n+1;i++) { cin >> a[i].money; a[i].id = i; } for(register int i = 1;i <= n;i++) cin >> b[i]; sort(a+1,a + n + 1 + 1,cmp); sort(b + 1,b + n + 1); for(register int i = 1;i <= n;i++) c1[i] = c1[i-1] + max(a[i].money-b[i],0); for(register int i=n+1;i >= 1;i--) c2[i] = c2[i+1] + max(a[i].money-b[i-1],0); for (register int i = 1;i <= n+1;i++) rk[a[i].id] = i; for (register int i = 1;i <= n+1;i++) cout << c1[rk[i]-1] + c2[rk[i]+1] << ' '; delete a;delete c1;delete c2; return 0; }
-
0
极限压缩流,四行
#include <iostream> #include <cstring> #include <algorithm> using namespace std;struct T{int money;int id;};bool cmp(T a,T b){return a.money<b.money;}int main(void){register int n,*b,*c1,*c2,*rk;register T *a;cin>>n;a=new T[n+3];b=new int[n+3];c1=new int[n+3];memset(c1,0,(n+3)*sizeof(int));c2=new int[n+3];memset(c2,0,(n+3)*sizeof(int));rk=new int[n+3];for(register int i=1;i<=n+1;i++){cin>>a[i].money;a[i].id=i;}for(register int i=1;i<=n;i++)cin>>b[i];sort(a+1,a+n+1+1,cmp);sort(b+1,b+n+1);for(register int i=1;i<=n;i++)c1[i]=c1[i-1]+max(a[i].money-b[i],0);for(register int i=n+1;i>=1;i--)c2[i]=c2[i+1]+max(a[i].money-b[i-1],0);for (register int i=1;i<=n+1;i++)rk[a[i].id]=i;for (register int i=1;i<=n+1;i++)cout<<c1[rk[i]-1]+c2[rk[i]+1]<<' ';delete a;delete c1;delete c2;return 0;}
-
0
#include <iostream> #include <iomanip> #include <stdio.h> #include <bits/stdc++.h> #include <algorithm> #include <cmath> #include <string> using namespace std; struct T { int money,id; } ; bool cmp(T a,T b) { return a.money < b.money; } int n,b[200005],c1[200005],c2[200005],rk[200005]; T a[200005]; int main() { cin >> n; for(int i = 1;i <= n+1;i++) cin >> a[i].money,a[i].id = i; for(int i = 1;i <= n;i++) cin >> b[i]; sort(a+1,a+n+1+1,cmp); sort(b+1,b+n+1); for(int i = 1;i <= n;i++) c1[i] = c1[i-1] + max(a[i].money-b[i],0); for(int i = n+1;i >= 1;i--) c2[i] = c2[i+1] + max(a[i].money-b[i-1],0); for (int i = 1;i <= n+1;i++) rk[a[i].id] = i; for (int i = 1;i <= n+1;i++) cout << c1[rk[i]-1] + c2[rk[i]+1] << " "; return 0; }
-
0
- 统计数组c1和c2,分别记录从前往后或从后往前计算第i个位置的花钱总数。
a1 a2 a3 a4 a5 a6 b1 b2 b3 b4 b5 所以c1[i]从后往前是
c1[i-1]+max(a[i]-b[i],0)
所以c2[i]从后往前是c2[i+1]+max(a[i]-b[i-1],0)
- 排序a[i]数组
- 去掉a[i]的结果:c1[rk[i]-1]+c2[rk[i]+1]
参考代码:
#include <iostream> #include <cstring> #include <algorithm> using namespace std; struct T{ int money; int id; }; bool cmp(T a,T b){ return a.money<b.money; } int main(void){ register int n,*b,*c1,*c2,*rk; register T *a; cin>>n; a=new T[n+3]; b=new int[n+3]; c1=new int[n+3]; memset(c1,0,(n+3)*sizeof(int)); c2=new int[n+3]; memset(c2,0,(n+3)*sizeof(int)); rk=new int[n+3]; for(register int i=1;i<=n+1;i++){ cin>>a[i].money; a[i].id=i; } for(register int i=1;i<=n;i++) cin>>b[i]; sort(a+1,a+n+1+1,cmp); sort(b+1,b+n+1); for(register int i=1;i<=n;i++) c1[i]=c1[i-1]+max(a[i].money-b[i],0); for(register int i=n+1;i>=1;i--) c2[i]=c2[i+1]+max(a[i].money-b[i-1],0); for (register int i=1;i<=n+1;i++) rk[a[i].id]=i; for (register int i=1;i<=n+1;i++) cout<<c1[rk[i]-1]+c2[rk[i]+1]<<' '; delete a; delete c1; delete c2; return 0; }
不可以抄袭。
- 1
信息
- ID
- 503
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- (无)
- 递交数
- 218
- 已通过
- 151
- 上传者