int n; int arr[N]; intmain(){ cin >> n; for (int i = 0 ; i < n ; i ++){ scanf("%d",arr + i); } int start = 0; int res = 0; for (int i = 1 ; i < n ; i ++){ if (arr[i] < arr[start]) start = i; else{ res += arr[i] - arr[start]; start = i; } } cout << res <<endl; }
python版本
1 2 3 4 5 6 7 8 9 10 11
#股票买卖II #所有一段时间的交易都可以拆成过程量为1的交易的和 n = int(input()) arr = [int(i) for i in input().split()]
res = 0 for i in range(1,n): if arr[i] > arr[i - 1]: res += arr[i] - arr[i - 1]
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> usingnamespacestd; typedeflonglong LL; int n; constint N = 1000010; int arr[N]; int C[N]; intmain(){ cin >> n; LL sum = 0; for(int i =0 ; i < n ; i ++){ scanf("%d",arr + i); sum += (LL)arr[i]; } LL ave = sum / n;
for(int i =1 ; i < n ; i ++){ C[i] = C[i - 1] - ave + arr[i - 1]; } sort(C,C+n); int i = 0; LL res = 0; while (i < n - 1 - i){ res += (LL)C[n - i - 1] - C[i]; i += 1; } cout << res << endl;
for (int i = 0 ;i < n ; i ++){ double x,y; scanf("%lf %lf",&x,&y); if(abs(y) > R) { cout << -1 << endl; return0; } S[i].left = x - sqrt(R*R - y*y); S[i].right = x + sqrt(R*R - y*y); } sort(S,S+n,cmp);
int res = 1; double start = S[0].right; for(int i =1 ; i < n ;i ++){ if (S[i].left <= start) continue; else{ start = S[i].right; res += 1; } } cout << res << endl;
n,R = map(int,input().split()) flag = False data = [] for i in range(n): a,b = map(int,input().split()) temp = pow(R*R - b*b,0.5) if b > R: print(-1) flag = True break data.append((a - temp,a + temp))
data = sorted(data,key = lambda x : x[1]) #按照右端点排序
if flag == False: res = 1 start = data[0][1]
for i in range(1,n): if data[i][0] <= start: continue else: start = data[i][1] res += 1
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> usingnamespacestd; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int n; double S; constint N = 500010; int arr[N]; double out[N]; double ave; bool flag = false; doubleS_square(double *out){ double res; for(int i = 0 ; i < n ; i ++){ //cout << out[i] << ' '; res += (out[i] - ave)*(out[i] - ave); } //cout << endl; res = sqrt(res / n); return res; }
intmain(int argc, char** argv){ cin >> n >> S; for(int i = 0; i < n ; i ++){ scanf("%d",arr + i); } sort(arr,arr+n);
#付账问题 n,s = map(int,input().split()) arr = [int(i) for i in input().split()] out = [0]*(n+1)
arr.sort() ave = s / n curAve = ave
start = 0 curLeft = 0 flag = False#停止条件 whileTrue: for i in range(start,n): if arr[i] <= curAve: curLeft += curAve - arr[i] out[i] = arr[i] else: if start == i: for i in range(start,n): out[i] = curAve flag = True break
else: start = i break
if flag: break
curAve += curLeft / (n - start) curLeft = 0
res = 0 for i in range(n): res += pow(out[i] - ave,2)
typedeflonglong LL; constint N = 100010,mod = 1000000009; int n,k; int arr[N]; int res = 1; intmain(){ cin >> n >> k; for(int i = 0 ; i < n ; i ++){ scanf("%d",arr + i); } sort(arr,arr+n); int sign = 1; int left = 0,right = n - 1; if(k % 2== 1){ res = arr[right]; right -= 1; k -= 1; if (res < 0) sign = -1; } while (k){ LL x = (LL)arr[left]*arr[left + 1],y = (LL)arr[right]*arr[right - 1]; if (x * sign > y * sign){ res = x % mod * res % mod; left += 2; k -= 2; } else{ res = y % mod * res % mod; right -= 2; k -= 2; } } cout << res << endl; }
#乘积最大(双指针) defmod(a,b,M): if a * b < 0: return -((-a * b) % M) else: return a * b % M
M = 1000000009 n,k = map(int,input().split()) arr = [] for i in range(n): arr.append(int(input())) arr.sort()
left = 0 right = n - 1 sign = 1
res = 1 if k % 2 == 1: res = arr[right] right -= 1 k -= 1 if res < 0: sign = -1
while k: x = arr[left]*arr[left + 1] y = arr[right]*arr[right - 1] if x*sign > y*sign: res = mod(res,x,M) left += 2 k -= 2 else: res = mod(res,y,M) right -= 2 k -= 2
print(res)
1247. 后缀表达式
给定 NN 个加号、MM 个减号以及 N+M+1N+M+1 个整数 A1,A2,⋅⋅⋅,AN+M+1A1,A2,···,AN+M+1,小明想知道在所有由这 NN 个加号、MM 个减号以及 N+M+1N+M+1 个整数凑出的合法的后缀表达式中,结果最大的是哪一个?
typedeflonglong LL; int n,m; constint N = 200010; int arr[N]; intmain(){ cin >> n >> m; int maxSam = -99999999; int minSam = 99999999; int maxIndex,minIndex; for(int i = 0 ; i < n+m+1; i ++){ scanf("%d",arr + i); if (maxSam < arr[i]){ maxIndex = i; maxSam = arr[i]; } if (minSam > arr[i]){ minIndex = i; minSam = arr[i]; } }
LL res = 0;
if (m > 0){ res = -1*(LL)minSam + (LL)maxSam; for(int i = 0 ; i < n+m+1 ; i ++){ if(i == maxIndex || i == minIndex) continue; if (arr[i] < 0) res -= (LL)arr[i]; else res += (LL)arr[i]; } } else{ for(int i = 0 ; i < n + m + 1 ; i ++){ res += (LL)arr[i]; } } cout << res << endl; }
#后缀表达式 n,m = map(int,input().split()) arr = [int(i) for i in input().split()]
res = 0
if m == 0: print(sum(arr)) else: maxSam = -float('inf') minSam = float('inf') for var in arr: minSam = min(minSam,var) maxSam = max(maxSam,var) if var < 0: res -= var else: res += var
if minSam > 0: res -= 2*minSam if maxSam < 0: res += 2*maxSam
//定位p0与pn的位置 for(int i = 0 ; i <= n ; i ++){ if (preSum[i] == p0 ){ p0 = i; break; } }
for(int i = n ; i >= 0 ; i --){ if (preSum[i] == pn ){ pn = i; break; } }
int l = 0; int r = n; for(int i = p0 ; i >= 0 ; i -= 2){ res[l ++] = preSum[i]; vis[i] = true; } for(int i = pn ; i <= n ; i += 2){ res[r --] = preSum[i]; vis[i] = true; } for(int i = 0 ; i <= n ; i ++){ if (vis[i] == false){ res[l ++] = preSum[i]; } } LL ans = -9999999999; for(int i = 1 ; i <= n ; i ++){ ans = max(ans,abs(res[i] - res[i - 1])); } cout << ans << endl; } return0; }
preSum.sort() for i in range(n+1): if p0 == preSum[i]: p0 = i break for i in range(n,-1,-1): if pn == preSum[i]: pn = i break
vis = [False]*(n+1) res = [0]*(n+1) ans = -float('inf')
left = 0 right = n for i in range(p0,-1,-2): res[left] = preSum[i] left += 1 vis[i] = True for i in range(pn,n+1,2): res[right] = preSum[i] right -= 1 vis[i] = True for i in range(n+1): if vis[i] == False: res[left] = preSum[i] left += 1 for i in range(1,n+1): ans = max(abs(res[i] - res[i - 1]),ans)