今天又被布置了三道题。
100342D 100342F 100342G
只做了100342D,高精度居然还能写错。。。然而还没调对。。。
这题就是高精度+简单dp
错误代码,仅作记录。。。
using namespace std;
const int maxn=410;
struct bign
{
int siz,s[maxn],f;
bign ()
{
memset(s, 0, sizeof(s));siz=1;}
bign (int num)
{ *this = num; }
bign (const char *num)
{ *this = num; }
bign operator = (const char *num)
{
siz=int(strlen(num));
for(int i=0;num[i]=='0';num++);
for(int i=0;i1]-'0';
}
return *this;
}
bign operator = (const int num)
{
char s[maxn];
sprintf(s,"%d",num);
*this=s;
return *this;
}
bool operator < (const bign &b)
{
if(siz!=b.siz)
return sizfor(int i=siz-1;i>=0;i--)
{
if(s[i]!=b.s[i])
return s[i]return false;
}
bool operator > (const bign &b)
{
if(siz!=b.siz)
return siz>b.siz;
for(int i=siz-1;i>=0;i--)
{
if(s[i]!=b.s[i])
return s[i]>b.s[i];
}
return false;
}
bool operator == (const bign num)
{
return !(*this>num) && !(*thisbool operator != (const bign num)
{
return !(*this==num);
}
bign operator + (const bign &b)
{
bign c;
c.siz=0;
int j=0;
for(int i=0;(j || iint x=j;
if(iif(i10;
j=x/10;
}
return c;
}
bign operator * (const bign &b)
{
bign c;
c.siz=siz+b.siz;
for(int i=0;ifor(int j=0;jfor(int i=0;i1]+=c.s[i]/10;
c.s[i]%=10;
}
return c;
}
void begi()
{
f=-1;
}
void str()
{
for(int i=0;icout<cout<105][105];
int n,k;
bign dfs(int i,int j)
{
if(dp[i][j]!=-1)
return dp[i][j];
else
if(i>j)
{
dp[i][j]=0;
return 0;
}
else
{
if(i==0 && j==0)
{
dp[i][j]=1;
return 1;
}
else
{
if(i==0)
{
dp[i][j]=dfs(i,j-1)*k;
return dp[i][j];
}
else
{
dp[i][j]=dfs(i-1,j-1)*i+dfs(i,j-1)*(k-i);
return dp[i][j];
}
}
}
}
int main()
{
cin>>n>>k;
for(int i=0;i<=100;i++)
for(int j=0;j<=100;j++)
dp[i][j]=-1;
dp[0][0]=1;
bign ans=dfs(k,n);
ans.str();
return 0;
}
然后是昨天atcoder grand contest018的b,a的话已经对了,然而b还没有改对,这题是个“感性”的贪心,就是要做到每一步操作都是最优的。依旧是错误代码。。。
using namespace std;
int n,m,tot;
int a[305][305];
int ma[305];
bool f=1;
bool used[305];
vectorint ,bool> > tr;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
int sum=0,spo=0;
for(int i=1;i<=n;i++)
{
ma[a[i][1]]++;
}
for(int i=1;i<=m;i++)
{
if(ma[i]>0)
tr.pb(mp(i,0));
if(sumint i=spo;
//cout<<"-------"<
//cout<
//cout<<"-------"<
while(f)
for(int p=0;pmemset (ma,0,sizeof(ma));
tr[p].se=1;
tot++;
used[i]=1;
for(int k=1;k<=n;k++)
{
for(int j=1;j<=m;j++)
{
if(!used[a[k][j]])
{
ma[a[k][j]]++;
break;
}
}
}
used[i]=0;
int sum1=0,spo1=0;
//cout<<"-------"<
vectorint ,bool> > tr1;
for(int j=1;j<=m;j++)
{
if(ma[j]>0)
tr1.pb(mp(j,0));
if(sum1//cout<
}
//cout<
//cout<<"-------"<
//cout<
if(sum1<=sum && !used[spo1])
{
used[spo]=1;
sum=sum1;
spo=spo1;
i=spo;
tr=tr1;
//cout<<"-------"<
//cout<
}
else
{
if(tot1 ].fi;
}
if(tot==tr.size())
{
f=false;
}
}
cout<return 0;
}
还有一道是85d,这题一直超时,打算看一下题解再写,就不贴代码了。。。