HDU4357(数学思维题)
生活随笔
收集整理的這篇文章主要介紹了
HDU4357(数学思维题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:String change
?
把26個字母看成0~25對應的數字,當數慢慢增大時就對26取模,則字符串有一個總和s1,要使其變為末狀態的總和s2;那么每交換一次s1要加2,故,s1+s2必須為偶數。兩個字母單獨處理,兩個以上時,
以三個數字為例,(a,b,c)為三個數,則有(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)(一邊不動,相鄰的交換);
因此,一開始可任意按需要進行交換使s1中的各數與s2中的各數相等,再進行調位置。
如果是兩個數就不一樣了,設要由(a1,a2)->(b1,b2),則a1必經偶數變為b1或經奇數步
變為b2;又由于26步之后a1,a2又會變回原狀態,故必在26步之內要解決變形,先設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; }
?
?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的HDU4357(数学思维题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU4099(斐波那契数列与字典树)
- 下一篇: 素数与线性筛选法初级版