ZOJ 3962:Seven Segment Display(思维)
生活随笔
收集整理的這篇文章主要介紹了
ZOJ 3962:Seven Segment Display(思维)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://vjudge.net/problem/ZOJ-3962
題意:有16種燈,每種燈的花費是燈管數目,代表0~F(十六進制),現在從x開始跳n-1秒,每一秒需要的花費是表示當前的數的花費之和,問n-1秒后這段時間的花費總共是多少。跳到FFFFFFFF之后會跳回00000000.
思路:懷疑人生的題目。如果從平時計算[L,R]的花費,就計算[0,R] - [0,L-1]這樣的角度來看,就會好做很多。同樣如果跳到1LL<<32之后回到0,也分段考慮。這樣寫一個函數就可以計算了。
考慮三種東西:
a:跑第i位的時候總共完整跑了幾輪的貢獻(即0~F)。
b:跑第i位的時候完整跑完之后還剩了多余的幾輪的貢獻(即0~bit[i])。
c:跑第i位的時候跑完a和b之后還剩一些多余的秒,這個時候顯示器是顯示bit[i]的,因此要加上bit[i]*剩余的秒。
a和b每次都停留了1LL<<(4 * i)秒。因此都要乘上這個權。
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long LL; 4 const LL MOD = 1LL << 32; 5 int w[] = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6, 6, 5, 4, 5, 5, 4 }; 6 LL sum[20]; 7 8 LL solve(LL x) { 9 if(x < 0) return 0; 10 LL pw = 1, ans = 0; 11 // printf("x : %lld \n", x); 12 for(int i = 1; i <= 8; i++, pw <<= 4) { 13 LL a = x / (pw * 16) * sum[16]; // 這一位總共完整跑了幾輪 14 LL b = sum[x / pw % 16]; // 跑完a輪后還有剩余b次 15 LL c = (x % pw + 1) * w[x / pw % 16]; // 當前的這一位的這一個數要多加幾次,0也算一個所以+1 16 ans += (a + b) * pw + c; // a和b每次都會停留pw秒 17 } 18 return ans; 19 } 20 21 int main() { 22 sum[0] = 0; 23 for(int i = 1; i <= 16; i++) sum[i] = sum[i-1] + w[i-1]; 24 int t; scanf("%d", &t); 25 while(t--) { 26 LL n, x; 27 scanf("%lld%llx", &n, &x); 28 if((x + n - 1) >= MOD) { // 分成 x 到 FFFFFFFF 和 0 到 (x + n - 1) % MOD 29 printf("%lld\n", solve(MOD - 1) - solve(x - 1) + solve(x + n - 1 - MOD)); 30 } else { 31 printf("%lld\n", solve(n + x - 1) - solve(x - 1)); 32 } 33 } 34 return 0; 35 } 36 /* 37 3 38 5 89ABCDEF 39 3 FFFFFFFF 40 7 00000000 41 */?
轉載于:https://www.cnblogs.com/fightfordream/p/6764475.html
總結
以上是生活随笔為你收集整理的ZOJ 3962:Seven Segment Display(思维)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NAT STURN,ICE
- 下一篇: Document类型知识大全