topcpder SRM 664 div2 A,B,C BearCheats eyesight x BearPlays equalPiles x BearSorts getProbability

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 A

B题,熊孩子合并石子,题意是给你三堆石子,每次可以选两个,设小的那堆石子数为X,大的那堆石子为Y,X变成2*X,Y变成Y-X。问最后可不可能使三堆石子数相同。

div2的数据,暴力dfs就过了。因为石子总数一定,状态可以只有两维。

#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 B

C题,熊孩子排序,熊孩子乱搞了一个LESS函数,返回true和false的概率各占一半,问用一个排好序的序列经过sort以后得到给出序列的概率。映射一下就完了。

#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;
}
*/

时间: 2024-12-17 21:29:52

topcpder SRM 664 div2 A,B,C BearCheats eyesight x BearPlays equalPiles x BearSorts getProbability的相关文章

TC SRM 664 div2 AB

#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; class BearCheats{ public: string eyesight(int A, int B){ char t[256]; string s1; sprintf(t, "%d", A); s1 = t; string s2; cha

TC SRM 664 div2 B BearPlaysDiv2 bfs

BearPlaysDiv2 Problem Statement    Limak is a little bear who loves to play. Today he is playing by moving some stones between three piles of stones. Initially, the piles contain A, B, and C stones, respectively. Limak's goal is to produce three equa

SRM 664 Div2 Hard: BearSortsDiv2(归并排序)

Problem Statement   Bear Limak was chilling in the forest when he suddenly found a computer program. The program was a correct implementation of MergeSort. Below you can find the program in pseudocode. # mergeSort(left,right) sorts elements left, lef

topcoder SRM 618 DIV2 WritingWords

只需要对word遍历一遍即可 int write(string word) { int cnt = 0; for(int i = 0 ; i < word.length(); ++ i){ cnt+=word[i]-'A'+1; } return cnt; } topcoder SRM 618 DIV2 WritingWords,布布扣,bubuko.com

topcoder SRM 618 DIV2 MovingRooksDiv2

一开始Y1,Y2两个参数看不懂,再看一遍题目后才知道,vector<int>索引代表是行数,值代表的是列 此题数据量不大,直接深度搜索即可 注意这里深度搜索的访问标识不是以前的索引和元素,而是一个交换元素后的整个状态vector<int>,这样可以避免重复元素的搜索 set<vector<int> > visit; bool flag; void dfs(vector<int>& src, vector<int>& d

topcoder SRM 618 DIV2 LongWordsDiv2

此题给出的条件是: (1)word的每个字母都是大写字母(此条件可以忽略,题目给的输入都是大写字母) (2) 相等字符不能连续,即不能出现AABC的连续相同的情况 (3)word中不存在字母组成xyxy的形式,即不存在第一个字符和第3个字符相等同时第2个字符和第4个字符相等的情况 对于第(2)种情况,只需要考虑word[i]!=word[i-1]即可 对于第(3)种情况,用一个4重循环遍历每种可能的情况,然后第一个字符和第3个字符相等同时第2个字符和第4个字符相等,则输出“DisLikes”即可

TOPCODER SRM 686 div2 1000

// TOPCODER SRM 686 div2 1000 Problem Statement 给出一个至多长 100 的字符串,仅包含 ( 和 ),问其中有多少个不重复的,合法的括号子序列. 子序列可以不连续:合法即括号序列的合法:答案模 1,000,000,007. Examples "(())(" Returns: 2 Correct non-empty bracket subsequences are "()" and "(())". &

SRM 628 DIV2

250  想想就发现规律了. 500  暴力,括号匹配. 1000 给一个f数组,如果i存在,那么f[i]也得存在,问这样的集合有多少种. 先拓扑一下,dp[i] = mul(dp[son]+1)最后环里面的元素的乘积是结果. #include <iostream> #include <cstdio> #include <string> #include <algorithm> #include <stdlib.h> #include <v

topcoder srm 628 div2 250 500

做了一道题,对了,但是还是掉分了. 第二道题也做了,但是没有交上,不知道对错. 后来交上以后发现少判断了一个条件,改过之后就对了. 第一道题爆搜的,有点麻烦了,其实几行代码就行. 250贴代码: 1 #include <iostream> 2 #include <cstring> 3 #include <queue> 4 #include <cmath> 5 #include <cstdio> 6 #include <algorithm&g