topcpder SRM 664 div2 A,B,C BearCheats , BearPlays equalPiles , BearSorts (映射)
A題,熊孩子測視力,水題,題意就是判斷一下兩個數對應位不相同的數字有多少個。
#include<bits/stdc++.h>using namespace std;class BearCheats{public:string eyesight(int A, int B){int digA[42],digB[42];int t = 0;while(A){digA[t++] = A%10;A/=10;}for(int i = 0; i < t; i++){digB[i] = B%10;B/=10;}int dif = 0;for(int i = 0; i < t; i++){if(digA[i]!=digB[i]) dif++;}if(dif<=1) return "happy";else return "glasses";}}; Pro AB題,熊孩子合并石子,題意是給你三堆石子,每次可以選兩個,設小的那堆石子數為X,大的那堆石子為Y,X變成2*X,Y變成Y-X。問最后可不可能使三堆石子數相同。
div2的數據,暴力dfs就過了。因為石子總數一定,狀態可以只有兩維。
給用數論的大神orz
#include<bits/stdc++.h> using namespace std; const int maxn = 501;bool vis[maxn][maxn];bool dfs(int *dat) {if(dat[0] == dat[1] && dat[1] == dat[2]) return true;int ndat[3]= {dat[0]<<1,dat[1]-dat[0],dat[2]};sort(ndat,ndat+3);if(!vis[ndat[0]][ndat[1]] && ( vis[ndat[0]][ndat[1]] = true,dfs(ndat))) return true;ndat[0] = dat[0]<<1; ndat[1] = dat[1]; ndat[2] = dat[2] - dat[0];sort(ndat,ndat+3);if(!vis[ndat[0]][ndat[1]] && ( vis[ndat[0]][ndat[1]] = true,dfs(ndat))) return true;ndat[0] = dat[0]; ndat[1] = dat[1]<<1; ndat[2] = dat[2] - dat[1];sort(ndat,ndat+3);if(!vis[ndat[0]][ndat[1]] && ( vis[ndat[0]][ndat[1]] = true,dfs(ndat))) return true;return false; }class BearPlaysDiv2{ public:string equalPiles(int A, int B, int C){if( (A+B+C)/3*3 != A+B+C ) return "impossible";int dat[3] = {A,B,C};sort(dat,dat+3);vis[dat[0]][dat[1]] = true;if(dfs(dat)) return "possible";else return "impossible";} }; Pro BC題,熊孩子排序,熊孩子亂搞了一個LESS函數,返回true和false的概率各占一半,問用一個排好序的序列經過sort以后得到給出序列的概率,其實就是問你比較次數。。。映射一下就完了。
?
舉個栗子:比如要得到的序列是2,4,3,1。那么它和有序的映射是如左邊所示,那么以原來的數字為key排序就得到了右邊的映射,
?
怎么得到原來的映射呢?只要反過來,以右邊的val做為key,key變成val。在排序就得到原來的映射了(這也就是為什么原來的映射一定要是有序的原因)。這和我們原來的問題有什么關系呢?當然有,觀察下面的key,
在這個反過來sort的過程中,下面的1 2 3 4變成了 2 4 3 1,正是我們要得到的序列。
?類似思路的題:CDOJ 485
#include<bits/stdc++.h> using namespace std; const int maxn = 550; int a[maxn]; int t[maxn]; const double onecmp = log(0.5); int times; void merge_sort(int* a,int l,int r) {if(r-l<=1) return ;int mid = (l+r)>>1;merge_sort(a,l,mid);merge_sort(a,mid,r);int i = l, j = mid, k =l,p;while(i < mid && j < r){if(times++,a[i]>=a[j]) t[k] = a[j++];else t[k] = a[i++];k++;}if(i == mid) for(p = j; p < r; p++) t[k++] = a[p];else for(p = i; p < mid; p++) t[k++] = a[p];for(k = l;k < r; k++) a[k] = t[k]; }class BearSortsDiv2{ public:double getProbability(vector <int> seq){for(int i = 0; i < seq.size(); i++){a[seq[i]-1] = i;}times = 0;merge_sort(a,0,seq.size());//log(ans);double ans =return times*onecmp;} }Bear; /* int main() {freopen("in.txt","r",stdin);vector<int> s;int tmp;while(~scanf("%d",&tmp))s.push_back(tmp);double ans = Bear.getProbability(s);printf("%lf",ans);return 0; } */ View Code?
轉載于:https://www.cnblogs.com/jerryRey/p/4695238.html
總結
以上是生活随笔為你收集整理的topcpder SRM 664 div2 A,B,C BearCheats , BearPlays equalPiles , BearSorts (映射)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: hdu 1026 Ignatius an
- 下一篇: 0-C相关01:NSlog函数介绍。
