蒟蒻15分代码,求救!!!

P3956 [NOIP2017 普及组] 棋盘

@[菜♂虚♂鲲](/user/216349) 我刚刚研究了一道YJH秒过的蓝题
by HeartBlock_Love @ 2019-11-11 23:11:48


``` #include<cstdio> #include<algorithm> #include<cctype> using namespace std; template <class code>inline code read(const code &a) { code x=0;short w=0;char ch=0; while(!isdigit(ch)) {w|=ch=='-';ch=getchar();} while(isdigit(ch)) {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();} return w?-x:x; } int a[55],b[1100],n,m,qz[1100],now[100],sum=0,waste=0,mid; inline bool check(int rr,int ww){ if(!rr)return 1; if(sum-waste<qz[mid])return 0; for(int i=ww;i<=n;++i) if(now[i]>=b[rr]){ now[i]-=b[rr]; if(now[i]<b[1])waste+=now[i]; if(b[rr]==b[rr-1]){ if(check(rr-1,i))return 1; } else if(check(rr-1,1))return 1; if(now[i]<b[1])waste-=now[i]; now[i]+=b[rr]; } return 0; } int main(){ n=read(n); for(int i=1;i<=n;i++)a[i]=read(a[i]),sum+=a[i]; m=read(m); for(int i=1;i<=m;i++)b[i]=read(b[i]); sort(b+1,b+m+1); for(int i=1;i<=m;i++)qz[i]=qz[i-1]+b[i]; int l=1,r=m; while(l<=r){ waste=0; for(int i=1;i<=n;i++)now[i]=a[i]; mid=(r-l)/2+l; if(check(mid,1))l=mid+1; else r=mid-1; } printf("%d\n",r); return 0; } ``` 一开始看到这个代码:哇,好强
by HeartBlock_Love @ 2019-11-11 23:13:12


@无可牵挂真巨
by 窃·格瓦拉 @ 2019-11-11 23:13:12


@[菜♂虚♂鲲](/user/216349) 别发私信,被禁了
by HeartBlock_Love @ 2019-11-11 23:13:47


@[菜♂虚♂鲲](/user/216349) 杨钧昊的代码
by HeartBlock_Love @ 2019-11-11 23:14:06


@[菜♂虚♂鲲](/user/216349) 结果,当我仔细地研究了题解后
by HeartBlock_Love @ 2019-11-11 23:14:38


fo现了这篇题解 ``` #include<algorithm> #include<cstdio> #include<cstring> #include<iostream> #define maxn 2005 using namespace std; int mid; int n,m; int mouth[maxn],cake[maxn]; int tot=0,space; int sum[maxn],fcake[maxn]; int cmp(const void *a, const void *b) { return(*(int *)a-*(int *)b); } bool dfs(int deep,int pos) { if(deep<=0)return 1; if(tot-space<sum[mid])return 0;//¼ôÖ¦ //dfsʱ¼Ç¼µ±Ç°À˷ѵĵ°¸âºÍ //×ܵ°¸âÁ¿-µ±Ç°À˷ѵĵ°¸âºÍ<µ±Ç°¶þ·ÖµÄÒªÂú×ãµÄ×ì´óСºÍ //¾Í˵Ã÷ÎÞ·¨Âú×㣬ÔòÍ˳ö¡£ for(int i=pos;i<=n;++i) { if(fcake[i]>=mouth[deep]) { fcake[i]-=mouth[deep]; if(fcake[i]<mouth[1]) space+=fcake[i]; if(mouth[deep]==mouth[deep-1]) //¼ôÖ¦ //dfsʱÈôµ±Ç°×ì°Í´óСÓëÏÂÒ»¸öÏàͬ£¬ÔòÏÂÒ»¸öÎÞÐè´Óµ°¸â1¿ªÊ¼Ã¶¾Ù //Ö±½Ó´Óµ±Ç°×ì°Íö¾ÙµÄµ°¸âi¿ªÊ¼ { if(dfs(deep-1,i)) return 1; } else if(dfs(deep-1,1)) return 1; if(fcake[i]<mouth[1]) space-=fcake[i]; fcake[i]+=mouth[deep]; } } return 0; } int main() { cin>>n; for(int i=1;i<=n;++i) { scanf("%d",&cake[i]); tot+=cake[i]; } cin>>m; for(int i=1;i<=m;++i) { scanf("%d",&mouth[i]); } qsort(cake+1,n,sizeof(int),cmp); qsort(mouth+1,m,sizeof(int),cmp); sum[0]=0; for(int i=1;i<=m;++i)sum[i]=sum[i-1]+mouth[i]; while(sum[m]>tot)--m;//¼ôÖ¦ //ÒÔ×îСµÄ×ìÀÛ¼Ó£¬Óëµ°¸â×ܺͱȽϣ¬ÕÒµ½×î¶àÄÜÂú×ãµÄ×ìÊý£¬¾ÍÊǶþ·ÖÉϱ߽ç int l=0,r=m; while(l<=r) { mid=l+r>>1; for(int i=1;i<=n;++i)fcake[i]=cake[i]; space=0; if(dfs(mid,1))l=mid+1; else r=mid-1; } cout<<l-1; puts(""); return 0; } ``` 哇, 真像
by HeartBlock_Love @ 2019-11-11 23:15:34


上一页 |