做的练习赛,已补全
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; }