博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3312: [Usaco2013 Nov]No Change
阅读量:5157 次
发布时间:2019-06-13

本文共 1228 字,大约阅读时间需要 4 分钟。

n<=1e5个东西,从左往右买,有K<=16个钱,每次花一个钱买可以买多个,买完不找零,问所有买完最多剩多少钱,无解-1.

一开始以为物品要做状态一直想不出来。。。。

f(i)--钱的状态为i最多能买多少个东西,f(i)=从f(j)+1开始买能买到哪里,其中j是i某一位少一个1的状态。最多买多少,在前缀和上二分。

dp时老是考虑多状态,咋整啊?看看哪些去掉对决策是没有影响的。不要老是受套路的影响一定要搞个“前i个数字”之类的状态,有时候是没有用的。

1 #include
2 #include
3 #include
4 //#include
5 //#include
6 #include
7 #include
8 //#include
9 using namespace std;10 11 bool isdigit(char c) { return c>='0' && c<='9';}12 int qread()13 {14 char c;int s=0,f=1;while (!isdigit(c=getchar())) f=(c=='-'?-1:1);15 do s=s*10+c-'0'; while (isdigit(c=getchar())); return s*f;16 }17 18 int n,K;19 #define maxn 10001120 int f[maxn],sum[maxn],v[20];21 int how(int x,int base)22 {23 int L=x,R=n;24 while (L
>1;27 if (base+sum[x]>=sum[mid]) L=mid;28 else R=mid-1;29 }30 return L;31 }32 int main()33 {34 K=qread(),n=qread();35 for (int i=1;i<=K;i++) v[i]=qread();36 sum[0]=0;for (int i=1;i<=n;i++) sum[i]=sum[i-1]+qread();37 f[0]=0;int ans=-1;38 for (int i=1;i<(1<
=n) ans=max(ans,left);49 }50 if (ans>=0) printf("%d\n",ans);51 else puts("-1");52 return 0;53 }
View Code

 

转载于:https://www.cnblogs.com/Blue233333/p/7737217.html

你可能感兴趣的文章
剑指offer题解02-10
查看>>
安装 SQL Server 2008,不断要求重启电脑,解决办法
查看>>
001.SSH配置文件
查看>>
node知识积累
查看>>
HDU 1710 Binary Tree Traversals
查看>>
mina 字节数组编解码器的写法 II
查看>>
理解MapReduce计算构架
查看>>
学习什么语言的问题,其实,不是一个问题......
查看>>
MongoRepository动态代理及jpa方法解析源码分析
查看>>
bzoj2015 [Usaco2010 Feb]Chocolate Giving
查看>>
bzoj1651[Usaco2006 Feb]Stall Reservations 专用牛棚
查看>>
spring中InitializingBean接口使用理解
查看>>
团队合作之Scrum
查看>>
关于开发和测试沟通的一些问题
查看>>
Redis教程_2
查看>>
通过java给qq邮箱发送信息
查看>>
style、currentStyle、getComputedStyle区别介绍
查看>>
Python List(列表)使用示例
查看>>
poj-3069-Saruman's Army
查看>>
webstorm的破解
查看>>