2018 zju 天梯賽選拔第二場 - e
難度大如狗
time limit: 1 second memory limit: 65536 kb
風學長有乙個只包含 「+」 和數字的算式,但是因為調皮的金學長,算式裡的 「+」 全都丟失了。
風學長很難過,你作為他的**,希望你能幫他算出,對於剩下的數字串,有多少種可能的合法算式,並將所有算式之和告訴他,他可能會考慮 bg 你吃黃燜雞。
輸入格式
本題有多組測試資料。第一行有乙個整數 t (1 ≤ t ≤ 100),表示資料組數。
對於每組資料,給定乙個字串 s (1 ≤ |s| ≤ 10),所有的字元都是 『1』 到 『9』,即原算式去掉所有 「+」 號後剩下的數字串。
輸出格式
每組資料輸出一行,代表所有合法算式答案之和。
樣例輸入
1125
樣例輸出
176提示
1251+25=26
12+5=17
1+2+5=8
——>125+26+17+8=176
先介紹我的瞎幾把解法:
我的思想是傳統遞迴,就是直接寫乙個cal函式,功能是返回乙個字串所有的所有有效算式的和。#include using namespace std;
#define m int_max
#define n (int)1e6+10
typedef long long ll;
string n;
ll arr[10] = ;
ll cal(string &str)
return temp;
}int main(void)
}
例如乙個字串abcde: cal(「abcde」)
那麼等於apow(「bcde」.size()-1, 2) + abpow(「cde」.size()-1, 2)……
之所我會這麼想,是因為我把整個字串劃分成兩部分,左邊是確定的,右邊是待定未分配加號位置的字串
那我所有有效算式裡面,我確定的左邊對結果值的貢獻必然是左邊的值乘以右邊的種類數(2^長度減一)
例如123的種類數就是4(1, 2, 3; 12, 3; 1, 23; 123) 12的種類數就是2(1, 2; 12)
然後遞迴下去就行了
然而時間複雜度很容易看出來,遞迴公式t(n) > t(1) + t(2) + t(3) ……t(n-1) (大於的原因是每次要取子串做atof操作)
也就是說t(n) > 2^n 。。。。可怕,不過n只有10,所以ac還是ac了。。。
在介紹傳統的列舉方法:
一共n的長度,中間有n-1個位置給你插,你可以選擇插或者不差,分別遞迴下去。#includeusing namespace std;
typedef long long ll;
ll ans;char a[1005];int n;
void dfs(int x,ll sum,ll now)
dfs(x+1,sum,now*10ll+a[x+1]-'0');
dfs(x+1,sum+now,a[x+1]-'0');
}int main()
}
插的話,就是加上now, 遞迴下去。
不插的話,now就等到以後要查的時候加給sum,暫時只是乘個10然後加上下一位
t(n) = 2t(n-1), 剛剛好是t(n) = 2^n;
不過好歹也是e題的一血,還是很佩服寫下這段**的人思維的清晰度的。
最後介紹一種按按每個位的價值算解答的方法:
這有點像dp,加乙個數就考慮該數對之前已有的數以及答案的貢獻。#include #include #include #include #include using namespace std;
int main(void)
printf("%lld\n",ans);
}}
例如一開始是1。
現在如果是21,也就是把2放在1的前面,那麼對原本的答案1有什麼影響呢。
很顯然,多了個21, 還多了個2;
也就是說,我多了20, 1翻了一倍,多了個2
注意看b,第一次b是1, 第二次是11, 第三次是112,第四次是1124。
那個t1和我的思路應該是一樣的,也就是多的這個數如果是單獨拿來加,就是乘後面的種類數
所以t1每次乘以二。。。
哎呀講不清楚,突然發現我好像也不太懂的樣子。
等哪天懂了再回來改博文吧。。。複雜度很顯而易見o(n)。
省賽選拔賽 組隊賽第二場
rank 5。2013年通化全國邀請賽的題。比賽時出了2道題,打完之後才知道杭電g 編譯器有問題,d題同樣的 c 能ac,g 一直超時。一開始a題交了好久次才過罰時好多,一著急就亂了,改乙個地方就提交,這個必須改。a hdu 4493 給出12個月的工資,求平均薪水,貌似是因為資料大和浮點數精度問題...
2018 清明第二場
a a題 a bulbs codeforces 615a 模擬出開關的情況即可 ac如下 include include include include include define mm a,b memset a,b,sizeof a define up a,b for int a 1 a b a...
OI賽第二場Reason For Living
小b準備設計施工方案。設計圖是乙個n n個點m m 條邊的圖,小b每次施工可以取圖中乙個還沒有完工的生成森林把它完工。為了加快施工效率,每次取的時候小b都會最大化當前這個生成森林的邊數。請你幫他找出乙個符合要求的施工方案。如果有多個方案,輸出任意一種即可。第一行兩個整數n n,m m 後面m m行,...