牛客寒假算法基礎集訓營1
阿新 • • 發佈:2019-01-23
++ http sum family 想要 scribe board 但是 ase
經過一番周折,小a終於算出了他想要的數,但是他卻忘記了最初的數是什麽。不過幸運的是他記下了整個操作序列,他想請你幫他算出最初的數
現在他有一個長度為nn的序列,其中只含有2,0,42,0,4這三種數字
設aiai為序列中第ii個數,你需要重新排列這個數列,使得∑ni=1(ai?ai?1)2∑i=1n(ai?ai?1)2最大(公式的含義是:每個數與前一個數差的平方的和)
註意:我們默認a0=0a0=0
https://ac.nowcoder.com/acm/contest/317#question
A.小a的計算器
題目描述
小a的數學基礎實在太差了,以至於他只會用計算器算數。他的計算器比較特殊,只有+,?,×,/+,?,×,/(即加減乘除)四種運算。經過一番周折,小a終於算出了他想要的數,但是他卻忘記了最初的數是什麽。不過幸運的是他記下了整個操作序列,他想請你幫他算出最初的數
輸入描述:
第一行兩個整數n,Xn,X,分別表示操作次數和最終的數
接下來nn行表示操作序列,每行兩個數opt,xopt,x
若opt=1opt=1,則表示將當前數加xx
若opt=2opt=2,則表示將當前數減xx
若opt=3opt=3,則表示將當前數乘 xx
若opt=4opt=4,則表示將當前數除以xx
輸出描述:
一個整數表示最初的數示例1
輸入
復制4 6 1 3 2 1 3 3 4 2
輸出
復制2
說明
樣例1解釋示例2
2+3=55?1=44?3=1212/2=62+3=55?1=44?3=1212/2=6
輸入
復制3 292 3 2 4 3 4 3
輸出
復制1314
備註:
n?100,0<X?1018n?100,0<X?1018
數據保證:
1. 最初的數在進行操作時不會超過long long範圍
2. 如果你的程序合法,那麽運算中所有的數均為整數,所有的除法均為整除!
3. 不會出現整數被0除的情況
代碼:
#include <bits/stdc++.h> using namespace std; int N; long long K; int op[10010]; long long num[10010]; int main() { scanf("%d%lld", &N, &K); for(int i = 0; i < N; i ++) scanf("%d%d", &op[i], &num[i]); long long ans = K; for(int i = N - 1; i >= 0View Code; i --) { if(op[i] == 1) ans -= num[i]; else if(op[i] == 2) ans += num[i]; else if(op[i] == 3) ans /= num[i]; else ans *= num[i]; } printf("%lld\n", ans); return 0; }
B.小a與"204"
題目描述
小a非常喜歡204204這個數字,因為′a′+′k′=204′a′+′k′=204。現在他有一個長度為nn的序列,其中只含有2,0,42,0,4這三種數字
設aiai為序列中第ii個數,你需要重新排列這個數列,使得∑ni=1(ai?ai?1)2∑i=1n(ai?ai?1)2最大(公式的含義是:每個數與前一個數差的平方的和)
註意:我們默認a0=0a0=0
輸入描述:
第一行一個整數nn
接下來一行nn個整數,第ii個數表示aiai
輸出描述:
輸出一個整數,表示∑ni=1(ai?ai?1)2∑i=1n(ai?ai?1)2的最大值
示例1
輸入
復制2 2 4
輸出
復制20
說明
樣例1解釋:按(4,2)(4,2)排列是最優的,此時sum=(4?0)2+(2?4)2=20sum=(4?0)2+(2?4)2=20
示例2
輸入
復制3 2 0 4
輸出
復制36
說明
樣例2解釋:按(4,0,2)(4,0,2)排列是最優的,此時sum=(4?0)2+(0?4)2+(2?0)2=36sum=(4?0)2+(0?4)2+(2?0)2=36
示例3
輸入
復制5 2 4 0 2 4
輸出
復制52
備註:
1?n?1051?n?105,保證aiai為2/0/42/0/4中的數
代碼:
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10; int N; int a[maxn]; int main() { scanf("%d", &N); int sum = 0; int zero = 0, two = 0, four = 0; for(int i = 1; i <= N; i ++) { scanf("%d", &a[i]); if(a[i] == 0) zero ++; if(a[i] == 2) two ++; if(a[i] == 4) four ++; } int temp = 0; while(N --) { if(temp == 0) { if(four) { sum += (4 - temp) * (4 - temp); four --; temp = 4; } else if(two) { sum += (2 - temp) * (2 - temp); two --; temp = 2; } else if(zero) { sum += (0 - temp) * (0 - temp); zero --; temp = 0; } } else if(temp == 4) { if(zero) { sum += (0 - temp) * (0 - temp); zero --; temp = 0; } else if(two) { sum += (2 - temp) * (2 - temp); two --; temp = 2; } else if(four) { sum += (4 - temp) * (4 - temp); four --; temp = 4; } } else { if(zero) { sum += (0 - temp) * (0 - temp); zero --; temp = 0; } else if(four) { sum += (4 - temp) * (4 - temp); four --; temp = 4; } else if(two) { sum += (2 - temp) * (2 - temp); two --; temp = 2; } } } printf("%d\n", sum); return 0; }View Code
FHFHFH
牛客寒假算法基礎集訓營1