分治/二分/递推

来源:互联网 发布:宁波易企网络 编辑:程序博客网 时间:2024/06/08 05:49

8-13

洛谷p1057传球游戏

(看到什么都像dp的毛病得改)

#include<bits/stdc++.h>using namespace std;int a[40][40]={0},n,m,l,r;int main(){scanf("%d%d",&n,&m);a[0][1]=1;for(int i=1;i<=m;i++)for(int j=1;j<=n;j++){l=j-1>0?j-1:n;r=j+1<=n?j+1:1;a[i][j]=a[i-1][l]+a[i-1][r];//本次的方案数等于上一次附近两同学的方案数之和}printf("%d",a[m][1]);return 0;}
p1025数的划分

写了dfs的版本,第二类string数什么的。。。以后再说吧(flag)

dfs+剪枝,暴力出奇迹

ps:c++的计时真的不准。。。

#include<bits/stdc++.h>using namespace std;int a[10]={0},n,k,s=0;void dfs(int deep,int sum){if((deep==k)&&(n-sum>=a[deep-1])){    s++;    return;}if(deep==k||sum>=n)return;for(int i=a[deep-1];i<=n-sum;++i){a[deep]=i;    dfs(deep+1,sum+a[deep]);}return;}int main(){scanf("%d%d",&n,&k);a[0]=1;dfs(1,0);printf("%d",s);return 0;}
明天:写完作业,质检员

8-16

p1314聪明的质监员

二分,智障错误耽误了一天。。。

#include<bits/stdc++.h>using namespace std;long long n,m,ss,w,now=40000000000000LL,ma=0;struct stone{long long weight,value;};stone a[200010];struct block{long long begin,end;};block b[200010];struct total{long long num,sum;};total s[200010];void in(){scanf("%d%d%lld",&n,&m,&ss);for(long long i=1;i<=n;i++)scanf("%lld%lld",&a[i].weight,&a[i].value);for(long long i=1;i<=m;i++)scanf("%lld%lld",&b[i].begin,&b[i].end);for(long long i=1;i<=n;i++)if(a[i].weight>ma)ma=a[i].weight;s[0].num=0;s[0].sum=0;    return;}void first(long long w){for(long long i=1;i<=n;i++){if(a[i].weight>=w){s[i].num=s[i-1].num+1;s[i].sum=s[i-1].sum+a[i].value;}else {s[i].num=s[i-1].num;s[i].sum=s[i-1].sum;}}return;}bool check(long long w){first(w);long long temp=0,now1;for(long long i=1;i<=m;i++)temp=temp+(s[b[i].end].num-s[b[i].begin-1].num)*(s[b[i].end].sum-s[b[i].begin-1].sum);now1=temp-ss;if(now1<0)now1=now1*-1;if(now1<now)now=now1;if(temp<ss)return false;//w太大else return true;//w太小}int main(){        in();long long l=0,r=ma+1,mid;bool bit;while(l+1<r){mid=(l+r)>>1;if(check(mid))l=mid;else r=mid;}bit=check(l);bit=check(r);printf("%lld",now);return 0;}


原创粉丝点击