链接:https://pan.baidu.com/s/12gSzPHEgSNbT5Dl2QqDNpA
提取码:fw39
复制这段内容后打开百度网盘手机App,操作更方便哦

D    Grid

 #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <iostream>
using namespace std; #define ll long long const int maxn=2e2+;
const int inf=1e9;
const double eps=1e-; char s[maxn][maxn]; int main()
{
int h,w,n,m,i,j,x,y;
scanf("%d%d%d",&h,&w,&n);
m=(h*w+)/;
if (n>m)
printf("-1");
else
{
for (i=;i<h;i++)
for (j=;j<w;j++)
s[i][j]='*';
x=,y=;
while (n--)
{
s[x][y]='#';
y+=;
if (y>=w)
{
x++;
if (s[x-][]=='#')
y=;
else
y=;
}
}
for (i=;i<h;i++)
{
for (j=;j<w;j++)
printf("%c",s[i][j]);
printf("\n");
}
}
return ;
}
/* */

G    Multithread

模拟

inf long long

 #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <iostream>
using namespace std; #define ll long long const int maxn=1e6+;
const ll inf=1e18;
const double eps=1e-; ll a[maxn],c[maxn],t=; int main()
{
int n,i,j;
double z;
scanf("%d",&n);
for (i=;i<=n;i++)
scanf("%lld",&a[i]);
sort(a+,a+n+);
a[n+]=inf;
j=;
for (i=;i<=n;i++)
{
while (a[j]==a[i])
j++;
c[i]=a[j];
}
for (i=;i<=n;i++)
{
t=max(t,a[i]);
if (t>=c[i])
{
printf("");
return ;
}
t+=ceil(sqrt(a[i]));
}
printf("");
return ;
}
/*
4
10 11 17 18 4
10 11 18 18 24 5
0 0 0 3 4 10
1000000000 1000000000 1000000000 1000000000 1000000000
1000000000 1000000000 1000000000 1000000000 1000000000
*/

I    Tree

贪心,一颗子树的权值和大于某个值则使用该子树,否则该子树必定被子树根的父亲使用。

其实上界可以为sum(c[i])/k,但二分,也节省不了几次操作。

注意long long,莫名其妙地使用“ll*”失效了,所以我输入的变量的类型设置为long long。

 #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <iostream>
using namespace std; #define ll long long const int maxn=1e5+;
const int inf=1e9;
const double eps=1e-; struct node
{
int d;
node *to;
}*e[maxn]; ll c[maxn],sum[maxn],m;
bool vis[maxn];
int g=; void dfs(int d)
{
vis[d]=;
node *p=e[d];
sum[d]+=c[d];
while (p)
{
if (!vis[p->d])
{
dfs(p->d);
sum[d]+=sum[p->d];
}
p=p->to;
}
if (sum[d]>=m)
g++,sum[d]=;
} int main()
{
node *p;
int x,y,i;
ll n,k,l,r;
scanf("%lld%lld",&n,&k);
for (i=;i<n;i++)
{
scanf("%d%d",&x,&y);
p=new node();
p->d=y;
p->to=e[x];
e[x]=p; p=new node();
p->d=x;
p->to=e[y];
e[y]=p;
}
for (i=;i<=n;i++)
scanf("%lld",&c[i]);
l=,r=*n/k;
while (l<=r)
{
m=(l+r)>>;
g=;
memset(vis,,sizeof(vis));
memset(sum,,sizeof(sum));
dfs();
if (g>=k)
l=m+;
else
r=m-;
}
printf("%lld",r);
return ;
}
/*
5 5
1 2
1 3
2 4
2 5
4 4 3 4 5
*/

K    Car

注意x,y的作用域,减少了不少方案。

还是那样,想清楚了再编码,验证一下测试样例,造多几个数据。

 #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <iostream>
using namespace std; #define ll long long const int maxn=1e6+;
const int inf=1e9;
const double eps=1e-; ll f[maxn][]; int main()
{
char ch;
ll a,b,c,d,x=,y=,sum=,v=<<;
int n,i;
bool vis=;
scanf("%d",&n);
for (i=;i<=n;i++)
{
scanf("\n%c",&ch);
if (ch=='C')
{
scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
sum+=(y+b)*v*;
sum-=b*(v-(x+a));
x+=a-c;
y+=b-d;
sum-=d*(x+v);
vis=;
}
else
{
scanf("%lld%lld",&a,&b);
if (!vis)
{
if (i&)
x+=a;
else
x-=a;
sum-=(v-x)*b;
y+=b;
}
else
{
if (i&)
x-=a;
else
x+=a;
sum-=(x+v)*b;
y-=b;
}
}
}
printf("%lld",sum);
return ;
}
/*
4
C 10 10 15 3
B 2 5
A 3 1
B 6 1 4
C 10 10 15 20
A 10 2
B 6 3
A 1 5 3
B 100 60
A 30 10
C 50 200 120 30 4
A 100 60
B 30 50
C 90 700 170 800
B 10 10
*/

J    Another Easy Problem

比赛时暴力了一发,感觉数值在[1,50]范围内,结果不会太大。看了一下数据,果然,结果<=5,但时间上仍然承受不了。

方法比较巧妙。其实这种题,要养成往dp想的习惯。。。

dp,差值可以选择用绝对值表示,因为sum(a[i])<=5000,所以途中,差值最多不超过2500,否则无法再‘’追‘’回来,使差值为0。而数组的第一维,可以使用滚动数组,数组的第二维,其实最多可以开到2500+50即可。

\( i为已判断i个数,j为差值 f[i][j]为对应的最小未使用数字个数\\f[i][j]=min(f[i-1][j]+1,min(f[i-1][j+a],f[i-1][abs(j-a)]) \)

 #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <iostream>
using namespace std; #define ll long long const int maxn=1e2+;
const int maxm=5e3+;
const int inf=1e9;
const double eps=1e-; int f[maxn][maxm]; int main()
{
int t,n,a,i,j;
scanf("%d",&t);
while (t--)
{
memset(f,0x3f,sizeof(f));
f[][]=;
scanf("%d",&n);
for (i=;i<=n;i++)
{
scanf("%d",&a);
for (j=;j<=;j++)
f[i][j]=min(f[i-][j]+,min(f[i-][j+a],f[i-][abs(j-a)]));
}
printf("%d\n",f[n][]);
}
return ;
}
/*
5
1 2 4 8 16 5
1 10 11 30 49
*/

B    Balls

比赛时考虑到与数学推导有关,没仔细想。

比赛时应该打表找规律的。哎,其它题写太卡了,耗费大量时间。

 #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <iostream>
using namespace std; #define ll long long const int maxn=1e4+;
const int inf=1e9;
const double eps=1e-;
ll sum=; void dfs(int k,int s,ll v)
{
if (k==)
// {
// printf("%lld ",v);
sum+=v;
// } else
{
for (int i=s-k+;i>=;i--)
dfs(k-,s-i,v*i);
}
} int main()
{
int k,s;
// scanf("%d%d",&k,&s);
for (k=;k<=;k++)
for (s=;s<=;s++)
{
sum=;
dfs(k,s,);
printf("%4lld",sum);
if (s==)
printf("\n");
else
printf(" ");
}
return ;
}
/* */

如果不熟悉,再打一个组合数学的表。

方法挺巧妙的!组合数学。

lucas,直接求逆超时了,求逆初始化,参见代码。

 #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <iostream>
using namespace std; #define ll long long const int maxn=5e6+;
const int inf=1e9;
const double eps=1e-; ll p,mul[maxn],chu[maxn]; ll pow(ll a,ll b)
{
ll y=;
while (b)
{
if (b & )
y=y*a%p;
a=a*a%p;
b>>=;
}
return y;
} ll cal(ll n,ll m)
{
if (n<m)
return ;
ll y=,i;
if (m+m>n)
m=n-m;
return mul[n]*chu[n-m]%p*chu[m]%p;
// for (i=1;i<=m;i++)
// y=y*(n+1-i)%p*pow(i,p-2)%p;
return y;
} int main()
{
ll n,m,r,i;
scanf("%lld%lld%lld",&m,&n,&p);
///init
mul[]=;
for (i=;i<p;i++)
mul[i]=mul[i-]*i%p;
chu[p-]=pow(mul[p-],p-);
for (i=p-;i>=;i--)
chu[i]=chu[i+]*(i+)%p; n+=m,m*=;
r=;
while (m)
{
r=r*cal(n%p,m%p)%p;
n/=p,m/=p;
}
printf("%lld",r);
return ;
}
/* */

E    Lolita Dress

组合公式变形

\( \begin{equation*}\begin{split}&\sum_{n=1}^{min(x,y)}(C_{x}^{n-1}*C_{y}^{n}) \\&=\sum_{n=1}^{min(x,y)}(C_{x}^{x-n+1}*C_{y}^{n}) \\&=C_{x+y}^{x+1}\end{split}\end{equation*} \)

 #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <iostream>
using namespace std; #define ll long long const int maxn=1e6+;
const int inf=1e9;
const double eps=1e-;
const ll mod=1e9+; int a[maxn];
ll mul[maxn],chu[maxn]; ll pow(ll a,ll b)
{
ll y=;
while (b)
{
if (b&)
y=y*a%mod;
a=a*a%mod;
b>>=;
}
return y;
} ll cal(ll x,ll y)
{
return mul[x]*chu[y]%mod*chu[x-y]%mod;
} int main()
{
ll sum=;
int n,x=,y=,i;
scanf("%d",&n);
mul[]=;
for (i=;i<=n;i++)
mul[i]=mul[i-]*i%mod;
chu[n]=pow(mul[n],mod-);
for (i=n-;i>=;i--)
chu[i]=chu[i+]*(i+)%mod; for (i=;i<=n;i++)
{
scanf("%d",&a[i]);
if (a[i])
y++;
}
for (i=;i<=n;i++)
if (a[i]==)
{
sum=(sum+cal(x+y,x+))%mod;
x++;
}
else
y--;
printf("%lld",sum);
return ;
}
/* */

A    Wormhole Construction

之前理解错题意了,只需要求最小的d,不需要最佳的方案(最小边)

打表找规律

 #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <iostream>
using namespace std; #define ll long long const int maxn=;
const int inf=1e9;
const double eps=1e-; int n,r; struct node
{
int a[maxn][maxn];
node()
{
int i,j;
for (i=;i<=n;i++)
for (j=;j<=n;j++)
a[i][j]=;
}
node operator*(node y)
{
node z=*this;
int i,j,k;
for (k=;k<=n;k++)
for (i=;i<=n;i++)
for (j=;j<=n;j++)
z.a[i][j]|=a[i][k]*y.a[k][j];
return z;
}
int work()
{
node z;
int i,j,l;
z=*this;
for (l=;l<n;l++)
{
z=z*(*this);
j=;
for (i=;i<=n;)
{
if (i!=j && z.a[i][j]==)
break;
if (j==n)
i++,j=;
else
j++;
}
if (i==n+)
return l;
}
return n;
}
}mat,result; void build(int i,int j)
{
int k,v;
///guess, fasten the speed
// if (r==2)
// return;
for (k=;k>=;k--)
{
if (k== && (i==j || mat.a[j][i]==))
continue;
mat.a[i][j]=k;
if (j==n)
{
if (i==n)
{
v=mat.work()+;
///observe
if (n>= && v==)
{
for (int u=;u<=n;u++)
{
for (int v=;v<=n;v++)
printf("%d ",mat.a[u][v]);
printf("\n");
}
printf("\n");
}
if (v<r)
{
r=v;
result=mat;
} return;
}
build(i+,);
}
else
build(i,j+);
}
} int main()
{
for (n=;n<=;n++)
{
r=n;
build(,);
printf("%d : %d\n",n,r);
// for (int i=1;i<=n;i++)
// {
// for (int j=1;j<=n;j++)
// printf("%d ",result.a[i][j]);
// printf("\n");
// }
}
return ;
}
/*
3 : 2
0 1 0
0 0 1
1 0 0
4 : 3
0 1 1 0
0 0 1 1
0 0 0 1
1 0 0 0
5 : 2
0 1 1 1 0
0 0 1 0 1
0 0 0 1 1
0 1 0 0 1
1 0 0 0 0
6 : 2
0 1 1 1 0 0
0 0 1 1 1 0
0 0 0 1 0 1
0 0 0 0 1 1
1 0 1 0 0 1
1 1 0 0 0 0
7 : 2
0 1 1 1 1 1 0
0 0 1 1 1 0 1
0 0 0 1 0 1 1
0 0 0 0 1 1 1
0 0 1 0 0 1 1
0 1 0 0 0 0 1
1 0 0 0 0 0 0
7 several minutes
*/

就能发现除了4之外,其它的答案都是2。

就能发现两个比较有意思的解法(当然,这是在已经答案的基础上,尴尬。。。)


 #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <iostream>
using namespace std; #define ll long long const int maxn=1e4+;
const int inf=1e9;
const double eps=1e-; int main()
{
int n,m,i,j,k;
scanf("%d",&n);
if (n==)
{
printf("3 4\n1 2\n2 3\n3 4\n4 1");
return ;
} if (n&)
{
m=n>>;
printf("2 %d\n",n*m);
for (i=;i<=n;i++)
for (j=;j<=m;j++)
{
k=i+j;
if (k>n)
k-=n;
printf("%d %d\n",i,k);
}
}
else
{
m=(n-)>>;
printf("2 %d\n",(n-)*m+);
for (i=;i<=n;i++)
for (j=;j<=m;j++)
{
k=i+j;
if (k>n)
k-=n-;
printf("%d %d\n",i,k);
}
printf("%d %d\n",,);
printf("%d %d\n",,+m+);
printf("%d %d\n",,);
printf("%d %d\n",+m+,);
}
return ;
}
/* */

CA Simple Problem

O((n*n/2)*n*n*(2m))

(n*n/2) [i,j]区间

n [i,j]区间中任意一点 被多算

2m 可以取到的值

事实上,n中取任意三点,n*(n-1)*(n-2)/6

 #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <iostream>
using namespace std; #define ll long long const int maxn=; ///pay attention
const int maxm=4e3+; ///2*m
const int inf=1e9;
const double eps=1e-; struct node1
{
int l,r,x,y;
bool operator<(const node1 &b)
{
return l<b.l;
}
}s1[maxm]; struct node2
{
int l,r,x,y;
bool operator<(const node2 &b)
{
return r<b.r;
}
}s2[maxm]; int f[maxn][maxn][maxm],temp[maxn][maxn][maxm],v[maxm],vv[maxm];
int pref[maxn][maxn][maxm],pret[maxn][maxn][maxm],re[maxn],vs[maxm],vt[maxm];
int add[maxm],fan[+]; void findarr(int i,int j,int g)
{
re[pref[i][j][g]]=v[g];
if (i<=pref[i][j][g]-)
findarr(i , pref[i][j][g]- , pret[i][ pref[i][j][g]- ][g]);
if (pref[i][j][g]+<=j)
findarr(pref[i][j][g]+ , j , pret[ pref[i][j][g]+ ][j][g]);
} int main()
{
int n,m,g=,l,r,x,y,c,i,j,k,s,t,value,cnt,sum;
scanf("%d%d",&n,&m);
for (i=;i<=m;i++)
{
scanf("%d%d%d%d",&l,&r,&x,&y);
vv[i*-]=x,vv[i*]=y;
s1[i]={l,r,x,y};
s2[i]={l,r,x,y};
}
sort(vv+,vv+m*+); ///m*2
vv[]=vv[]-;
for (i=;i<=m*;i++)
if (vv[i]!=vv[i-])
v[++g]=vv[i];
for (i=;i<=g;i++)
fan[v[i]]=i;
sort(s1+,s1+m+);
sort(s2+,s2+m+);
s1[m+].l=-,s2[m+].r=-;
j=;
for (i=;i<=n;i++) ///n
{
vs[i]=j;
while (s1[j].l==i)
j++;
}
j=;
for (i=;i<=n;i++)
{
vt[i]=j;
while (s2[j].r==i-)
j++;
} memset(f,0xff,sizeof(f));///-1
for (c=;c<n;c++)
for (i=,j=c+i;j<=n;i++,j++)
{
cnt=;
///l~r,值为v。一开始数量是0,l从左到右,遇到左端点(排序),若右端点小于等于r,且v in [x,y],加1;遇到右端点(排序),若左端点大于等于l,且v in [x,y],减1。
s=vs[i];
t=vt[i];
// if (i==2 && j==5)
// {
// printf("z");
// }
memset(add,,sizeof(add));
for (l=i;l<=j;l++)
{
///[i,l) (l,j]
///interval[x,y] i<=x<=l l<=y<=j
while (s1[s].l==l)
{
if (s1[s].r<=j)
add[fan[s1[s].x]]++,add[fan[s1[s].y]+]--;
s++;
}
while (s2[t].r==l-)
{
if (s2[t].l>=i)
add[fan[s2[t].x]]--,add[fan[s2[t].y]+]++;
t++;
}
cnt=;
for (k=;k<=g;k++)
{
cnt+=add[k];
value=temp[i][l-][k]+temp[l+][j][k]+cnt*v[k];
if (value>f[i][j][k])
{
f[i][j][k]=value;
pref[i][j][k]=l;
}
// f[i][j][k]=max(f[i][j][k],temp[i][l][k]+temp[l+1][j][k]+cnt*v[k]);
}
}
temp[i][j][g]=f[i][j][g];
pret[i][j][g]=g;
for (k=g-;k>=;k--)
{
if (temp[i][j][k+]>f[i][j][k])
{
temp[i][j][k]=temp[i][j][k+];
pret[i][j][k]=pret[i][j][k+];
}
else
{
temp[i][j][k]=f[i][j][k];
pret[i][j][k]=k;
}
// temp[i][j][k]=max(temp[i][j][k+1],f[i][j][k]);
}
}
sum=;
for (i=;i<=g;i++)
if (f[][n][i]>sum)
sum=f[][n][i],j=i;
// sum=max(sum,f[1][n][i]);
printf("%d\n",sum);
findarr(,n,j);
for (i=;i<=n;i++)
printf("%d%c",re[i],i==n?'\n':' ');
return ;
}
/*
5 1
2 4 15 20 5 2
1 3 5 10
4 5 2 4 5 2
1 5 10 15
1 5 5 8 5 2
1 4 10 15
2 3 5 8 5 2
1 4 5 8
2 3 10 15 5 4
1 3 5 7
2 4 7 8
3 5 9 9
1 4 4 5 5 5
1 2 3 5
2 3 4 6
3 4 2 5
4 5 3 4
1 5 7 8
*/

超时代码:处理cnt不当

 #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <iostream>
using namespace std; #define ll long long const int maxn=; ///pay attention
const int maxm=4e3+; ///2*m
const int inf=1e9;
const double eps=1e-; struct node1
{
int l,r,x,y;
bool operator<(const node1 &b)
{
return l<b.l;
}
}s1[maxm]; struct node2
{
int l,r,x,y;
bool operator<(const node2 &b)
{
return r<b.r;
}
}s2[maxm]; int f[maxn][maxn][maxm],temp[maxn][maxn][maxm],v[maxm],vv[maxm];
int pref[maxn][maxn][maxm],pret[maxn][maxn][maxm],re[maxn],vs[maxm],vt[maxm]; void findarr(int i,int j,int g)
{
re[pref[i][j][g]]=v[g];
if (i<=pref[i][j][g]-)
findarr(i , pref[i][j][g]- , pret[i][ pref[i][j][g]- ][g]);
if (pref[i][j][g]+<=j)
findarr(pref[i][j][g]+ , j , pret[ pref[i][j][g]+ ][j][g]);
} int main()
{
int n,m,g=,l,r,x,y,c,i,j,k,s,t,value,cnt,sum;
scanf("%d%d",&n,&m);
for (i=;i<=m;i++)
{
scanf("%d%d%d%d",&l,&r,&x,&y);
vv[i*-]=x,vv[i*]=y;
s1[i]={l,r,x,y};
s2[i]={l,r,x,y};
}
sort(vv+,vv+m*+); ///m*2
vv[]=vv[]-;
for (i=;i<=m*;i++)
if (vv[i]!=vv[i-])
v[++g]=vv[i];
sort(s1+,s1+m+);
sort(s2+,s2+m+);
s1[m+].l=-,s2[m+].r=-;
j=;
for (i=;i<=n;i++) ///n
{
vs[i]=j;
while (s1[j].l==i)
j++;
}
j=;
for (i=;i<=n;i++)
{
vt[i]=j;
while (s2[j].r==i-)
j++;
} memset(f,0xff,sizeof(f));///-1
for (c=;c<n;c++)
for (i=,j=c+i;j<=n;i++,j++)
{
for (k=;k<=g;k++)
{
cnt=;
///l~r,值为v。一开始数量是0,l从左到右,遇到左端点(排序),若右端点小于等于r,且v in [x,y],加1;遇到右端点(排序),若左端点大于等于l,且v in [x,y],减1。
s=vs[i];
t=vt[i];
// if (i==1 && j==4 && k==4)
// {
// printf("z");
// }
for (l=i;l<=j;l++)
{
///[i,l) (l,j]
///interval[x,y] i<=x<=l l<=y<=j
while (s1[s].l==l)
{
if (s1[s].r<=j && s1[s].x<=v[k] && v[k]<=s1[s].y)
cnt++;
s++;
}
while (s2[t].r==l-)
{
if (s2[t].l>=i && s2[t].x<=v[k] && v[k]<=s2[t].y)
cnt--;
t++;
}
value=temp[i][l-][k]+temp[l+][j][k]+cnt*v[k];
if (value>f[i][j][k])
{
f[i][j][k]=value;
pref[i][j][k]=l;
}
// f[i][j][k]=max(f[i][j][k],temp[i][l][k]+temp[l+1][j][k]+cnt*v[k]);
}
}
temp[i][j][g]=f[i][j][g];
pret[i][j][g]=g;
for (k=g-;k>=;k--)
{
if (temp[i][j][k+]>f[i][j][k])
{
temp[i][j][k]=temp[i][j][k+];
pret[i][j][k]=pret[i][j][k+];
}
else
{
temp[i][j][k]=f[i][j][k];
pret[i][j][k]=k;
}
// temp[i][j][k]=max(temp[i][j][k+1],f[i][j][k]);
}
}
sum=;
for (i=;i<=g;i++)
if (f[][n][i]>sum)
sum=f[][n][i],j=i;
// sum=max(sum,f[1][n][i]);
printf("%d\n",sum);
findarr(,n,j);
for (i=;i<=n;i++)
printf("%d%c",re[i],i==n?'\n':' ');
return ;
}
/*
5 1
2 4 15 20 5 2
1 3 5 10
4 5 2 4 5 2
1 5 10 15
1 5 5 8 5 2
1 4 10 15
2 3 5 8 5 2
1 4 5 8
2 3 10 15 5 4
1 3 5 7
2 4 7 8
3 5 9 9
1 4 4 5 5 5
1 2 3 5
2 3 4 6
3 4 2 5
4 5 3 4
1 5 7 8
*/

去年

FBeautiful Land

01背包,size,value, Totsize, solve maxValue。

空间太大,转变为以价值作为一维

\( v为当前的总价值,f[v]为对应的最小使用空间\\ f[v]=min(f[v],f[v-size_{i}]+cost_{i}) \)

O(sum(value)*n)

 #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <iostream>
using namespace std; #define ll long long const int maxn=1e4+;
const int inf=1e9;
const double eps=1e-; int f[maxn]; int main()
{
int t,n,m,i,j,a,b,tot;
scanf("%d",&t);
while (t--)
{
memset(f,0x3f,sizeof(f));
scanf("%d%d",&n,&m);
f[]=;
tot=;
while (n--)
{
scanf("%d%d",&a,&b);
tot+=b;
for (j=tot;j>=b;j--)
f[j]=min(f[j],f[j-b]+a);
}
for (i=tot;i>=;i--)
if (f[i]<=m)
break;
printf("%d\n",i);
}
return ;
}
/* */

Minieye杯第十五届华中科技大学程序设计邀请赛网络赛 部分题目的更多相关文章

  1. Minieye杯第十五届华中科技大学程序设计邀请赛网络赛D Grid(简单构造)

    链接:https://ac.nowcoder.com/acm/contest/560/D来源:牛客网 题目描述 Give you a rectangular gird which is h cells ...

  2. H-Modify Minieye杯第十五届华中科技大学程序设计邀请赛现场赛

    题面见 https://ac.nowcoder.com/acm/contest/700#question 题目大意是有n个单词,有k条替换规则(单向替换),每个单词会有一个元音度(单词里元音的个数)和 ...

  3. Minieye杯第十五届华中科技大学程序设计邀请赛现场同步赛 I Matrix Again

    Minieye杯第十五届华中科技大学程序设计邀请赛现场同步赛 I Matrix Again https://ac.nowcoder.com/acm/contest/700/I 时间限制:C/C++ 1 ...

  4. 第十四届华中科技大学程序设计竞赛决赛同步赛 A - Beauty of Trees

    A - Beauty of Trees 题意: 链接:https://www.nowcoder.com/acm/contest/119/A来源:牛客网 Beauty of Trees 时间限制:C/C ...

  5. 第十四届华中科技大学程序设计竞赛决赛同步赛 F Beautiful Land(01背包,背包体积超大时)

    链接:https://www.nowcoder.com/acm/contest/119/F来源:牛客网 Beautiful Land 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1 ...

  6. 第十四届华中科技大学程序设计竞赛 K Walking in the Forest【二分答案/最小化最大值】

    链接:https://www.nowcoder.com/acm/contest/106/K 来源:牛客网 题目描述 It's universally acknowledged that there'r ...

  7. 第十四届华中科技大学程序设计竞赛 J Various Tree【数值型一维BFS/最小步数】

    链接:https://www.nowcoder.com/acm/contest/106/J 来源:牛客网 题目描述 It's universally acknowledged that there'r ...

  8. 第十四届华中科技大学程序设计竞赛 C Professional Manager【并查集删除/虚点】

    题目描述 It's universally acknowledged that there're innumerable trees in the campus of HUST. Thus a pro ...

  9. 第十四届华中科技大学程序设计竞赛 B Beautiful Trees Cutting【组合数学/费马小定理求逆元/快速幂】

    链接:https://www.nowcoder.com/acm/contest/106/B 来源:牛客网 题目描述 It's universally acknowledged that there'r ...

随机推荐

  1. springboot No Identifier specified for entity的解决办法

    今天在做一个项目的时候遇到一个问题,实体类忘了指定主键id,然后报如下错误,也是自己粗心大意造成的,在此记录下. java.lang.IllegalStateException: Failed to ...

  2. Partition算法以及其应用详解上(Golang实现)

    最近像在看闲书一样在看一本<啊哈!算法> 当时在amazon上面闲逛挑书,看到巨多人推荐这本算法书,说深入浅出简单易懂便买来阅读.实际上作者描述算法的能力的确令人佩服.就当复习常用算法吧. ...

  3. 索引使用,分析初探。(explain分析执行计划,以及强制使用force index)

    促使这次探索的初衷还是因为要对一个定时脚本性能进行优化. 脚本有两个指定状态分别是status, latest_process_status,和一个超期时间expire_time进行限制. 按照我以前 ...

  4. C# 将当前应用程序写入到注册表开机启动项中

    在使用C#进行应用程序的开发过程中,经常有一个需求就是让应用程序开机后自动启动,这个是一个很常见的需求,最常规的做法(这里以Win7操作系统为例),打开:开始=>所有程序=>启动文件夹(路 ...

  5. 莫烦scikit-learn学习自修第四天【内置训练数据集】

    1. 代码实战 #!/usr/bin/env python #!_*_ coding:UTF-8 _*_ from sklearn import datasets from sklearn.linea ...

  6. delphi中如何实现DBGrid中的两列数据想减并存入另一列

    可参考下面的例子:   数据自动计算的实现:“金额”是由“单价”和“工程量”相乘直接得来的,勿需人工输入. 这可在“数据源构件”的onupdatedata例程添加如下代码实现: procedure T ...

  7. PLSQL 错误问题:Datebase character set (AL32UTF-8) and Client character set (ZHS16GBK) are different.

    (解决不了,网上用的是Orecal,我用的只是客户端.) 网上找到解决方法 打开注册表(ctr+R,输入regedit),根据报错提示找到注册表位置,但本机是win10 64位系统,根据以上路径找不到 ...

  8. springboot+jpa+mysql+swagger整合

    Springboot+jpa+MySQL+swagger整合 创建一个springboot web项目 <dependencies> <dependency>      < ...

  9. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.mybatis.spring.mapper.MapperScannerConfigurer#0'

    七月 05, 2018 10:26:54 上午 org.apache.tomcat.util.digester.SetPropertiesRule begin警告: [SetPropertiesRul ...

  10. Git要点

    前面的话 本文将总结Git要点 版本管理工具 [作用] 1.备份文件 2.记录历史 3.回到过去 4.对比差异 [分类] 1.手动版本控制(又叫人肉VCS) 2.LVCS 本地 3.CVCS 集中式( ...