现在的位置: 首页 > 综合 > 正文

TC SRM 562 DIV 2

2013年02月27日 ⁄ 综合 ⁄ 共 2426字 ⁄ 字号 评论关闭

做的练习赛,已补全

A。水题~但是出了个很神奇的错误。

return “NO”。我居然把O打成0了。。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <map>
#include <iomanip>
#define PI acos(-1.0)
#define Max 2005
#define inf 1<<28
#define LL(x) (x<<1)
#define RR(x) (x<<1|1)
#define FOR(i,s,t) for(int i=(s);i<=(t);++i)
#define ll long long
using namespace std;

bool cmp(int a,int b)
{
    return a>b;
}
class CucumberMarket {
	public:
	string check(vector <int> price, int budget, int k) {
	    int num=price.size();
        int *a=new int[num];
        for(int i=0;i<num;i++)
        a[i]=price[i];
        sort(a,a+num,cmp);
        int sum=0;
       for(int i=0;i<k&&i<num;i++)
       sum+=a[i];
        if(sum>budget)
        return "NO";
        else
        return "YES";

	}
};

B,模拟题,讲每个'B'标记一下,然后每找到一个‘B’,则从这里开始,沿着对角线遍历,找出下一个‘B’,比较两个之间的距离,sum+=min(两者的距离,T),因为有可能两个‘B’之间形不成直线,因为T的次数太小,所以得找出最小值。

int num[100][100];
class PastingPaintingDivTwo {
	public:
	long long countColors(vector <string> clipboard, int T) {
		memset(num,0,sizeof(num));
		int n,m;
		for(int i=0;i<clipboard.size();i++)
		{
		    n=clipboard.size();
		    for(int j=0;j<clipboard[i].length();j++)
		    {
		        m=clipboard[i].length();
		        if(clipboard[i][j]=='B')
		        {
		            num[i][j]++;
		        }
		    }
		}
		ll sum=0;
		for(int i=0;i<n;i++)
		{
		    for(int j=0;j<m;j++)
		    {
		        int spn=0;
		        int k;
		        int spp=0;
		        if(num[i][j])
		        {
		            for(k=0;k<=min(n-i,m-j);k++)
		            {
		                if(num[i+k][j+k])
		                {
		                    spp+=spn;
		                    spn=k-spp;
		                    sum+=min(spn,T);
		                }
		                num[i+k][j+k]=0;
		            }
		            //sum+=spn;
		            sum+=T;
		        }
		    }
		}
		return sum;
	}
};

C.又是悲剧的一题,第一交了发现数据溢出了,得用long long 存。。太大意了。一开始死都找不到哪里错了,最后烦起来就把所有的数据类型都改成了long long ,没想到过了。过了。。。。了。。。。

太粗心了。

题意很简单,就是给你两组数a[],b[],和一个数字的总数,叫你算出所有a[i],b[i]不相邻的概率。

状压,dp[i][j][k]表示第i位是j的k状态的总数。

ll t;
ll dp[15][15][1<<15];
class RandomOption
{
public:
    double getProbability(int keyCount, vector <int> badLane1, vector <int> badLane2)
    {
        bool Map[15][15]= {0};
        for(int i=0; i<badLane1.size(); i++)
        {
            Map[badLane1[i]][badLane2[i]]=Map[badLane2[i]][badLane1[i]]=1;//标记,不能相邻
        }
        for(int i=0; i<keyCount; i++)dp[1][i][1<<i]=1;
        t=1ll;
        for(int i=1; i<=keyCount; i++)t*=i; //总状态数 即是,keyCount!
        for(int i=0; i<keyCount; i++)//i位
        {
            for(int j=0; j<keyCount; j++)//是j
            {
                for(int k=0; k<1<<keyCount; k++)//枚举所有状态
                {
                    for(int l=0; l<keyCount; l++)//往j后面加l
                    {
                        if(Map[j][l]||Map[l][j])continue;// 如果l和j是badLane,则不能相邻
                        if((k>>l)&1)continue;//或者j的状态里已经有了l。
                        int nn=k|(1<<l);
                        dp[i+1][l][nn]+=dp[i][j][k];//第i+1位为l的总状态数。
                    }
                }
            }
        }
        ll ans=0;
        for(int i=0; i<keyCount; i++)
            ans+=dp[keyCount][i][(1<<keyCount)-1];//所有非badLane的状态数
            return (double)ans/t;
    }
};
//这个只是一个样例,可以跑跑看。
int main()
{
    RandomOption a;
    vector<int>q;
    q.push_back(0);
    vector<int >p;
    p.push_back(1);
    cout<<a.getProbability(14,q,p)<<endl;//这个样例就是让dp溢出int的数据。跪了。。。正确答案貌似是0.8....多少多少的。
    return 0;
}




抱歉!评论已关闭.