HDU4357(数学思维题)
題目:String change
?
把26個字母看成0~25對應(yīng)的數(shù)字,當(dāng)數(shù)慢慢增大時就對26取模,則字符串有一個總和s1,要使其變?yōu)槟顟B(tài)的總和s2;那么每交換一次s1要加2,故,s1+s2必須為偶數(shù)。兩個字母單獨(dú)處理,兩個以上時,
以三個數(shù)字為例,(a,b,c)為三個數(shù),則有(a,b,c)->(a,c+1,b+1)->(c+2,,a+1,b+1)->(c再分別
和a,b各交換12次,有(c+26,a+13,b+13),再a,b相互交換13次得(c+26,b+26,a+26);
而26為一個周期,即39次交換后由(a,b,c)->(c,b,a)(中間不動,兩邊交換了);
同理可證39次交換后,可由(a,b,c)->(b,a,c)(一邊不動,相鄰的交換);
因此,一開始可任意按需要進(jìn)行交換使s1中的各數(shù)與s2中的各數(shù)相等,再進(jìn)行調(diào)位置。
如果是兩個數(shù)就不一樣了,設(shè)要由(a1,a2)->(b1,b2),則a1必經(jīng)偶數(shù)變?yōu)閎1或經(jīng)奇數(shù)步
變?yōu)閎2;又由于26步之后a1,a2又會變回原狀態(tài),故必在26步之內(nèi)要解決變形,先設(shè)a1變形成功,再只須檢查a2有沒有變形成功即可。
#include <iostream> #include <string.h> #include <stdio.h>using namespace std; char a[100],b[100];int main() {int cas,T=1,a1,a2,b1,b2;scanf("%d",&cas);while(cas--){int i,t=0;scanf("%s%s",a,b);int len=strlen(a);if(len>2){for(i=0;i<len;i++)t+=(a[i]-'a'+b[i]-'a');if(t&1)printf("Case #%d: NO\n",T++);elseprintf("Case #%d: YES\n",T++);}else{a1=a[0]-'a';a2=a[1]-'a';b1=b[0]-'a';b2=b[1]-'a';i=(b1-a1+26)%26;if(i%2==0&&(a2+i)%26==b2)printf("Case #%d: YES\n",T++);else{i=(b2-a1+26)%26;if(i%2==1&&(a2+i)%26==b1)printf("Case #%d: YES\n",T++);else printf("Case #%d: NO\n",T++);}}}return 0; }
?
?
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的HDU4357(数学思维题)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU4099(斐波那契数列与字典树)
- 下一篇: 素数与线性筛选法初级版