7.8noip测试

来源:互联网 发布:hmmlearn python 教程 编辑:程序博客网 时间:2024/05/16 16:13

第一题:能量

题意:n个蓄电池电量不同,传输有耗费(k%),若使所有电池电量等,求电量相等时最大值为多少。

题解:二分检验。

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<ctime>#include<cmath>#include<algorithm>#include<cctype>#include<iomanip>#define eps 1e-7using namespace std;inline int read(){int i=0,f=1;char ch;for(ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-') f=-1;for(;isdigit(ch);ch=getchar())i=(i<<3)+(i<<1)+(ch^48);return i*f;}double a[10101],ratio,sum;int n,k;bool check(double x){if(x*n>sum) return false;int i;double p1,p2;p1=0,p2=0;for(i=n;i>=1;--i){if(a[i]<x) break;p1+=a[i]-x;}for(;i>=1;--i)p2+=x-a[i];if(p1*ratio>p2) return true;else return false;}signed main(){sum=0;n=read();k=read();ratio=(100.0-k)/100;for(int i=1;i<=n;++i)a[i]=read(),sum+=a[i];sort(a+1,a+n+1);double l=a[1],r=a[n],mid;while((r-l)>eps){mid=(l+r)/2;if(check(mid))l=mid;else r=mid;}printf("%.6lf",r);return 0;}
第二题:电影院

题意:尬,忘了;

题解:看到题一眼就担心数组系列。
上帝说:“要有map!”然后这道题应声倒地……

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<ctime>#include<cmath>#include<algorithm>#include<cctype>#include<iomanip>#include<queue>#include<map>#define int long longusing namespace std;inline int read(){int i=0,f=1;char ch;for(ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-') f=-1;for(;isdigit(ch);ch=getchar())i=(i<<3)+(i<<1)+(ch^48);return i*f;}map<double,int>f;map<double,int>g;double slope[101101],abslope[101101];int maxa,maxb,w,ans,revi,ccp,h,j;int rev(int num){int tmp1=num,tmp2=0;while(tmp1){tmp2=tmp2*10+tmp1%10;tmp1/=10;}return tmp2;}inline int gcd(int a,int b){if(b) return gcd(b,a%b);return a;}signed main(){maxa=read();maxb=read();w=read();if(maxa>maxb)swap(maxa,maxb);ans=maxa*maxb+1;for(int i=1;i<=maxb;++i){revi=rev(i);ccp=gcd(revi,i);slope[i]=(double)(i/ccp)/(revi/ccp);abslope[i]=(double)(revi/ccp)/(i/ccp);}for(int i=1;i<=maxa;++i)++f[slope[i]];for(j=0;j<maxb&&h<w;){++j;++g[slope[j]];h+=f[abslope[j]];}if(h<w){cout<<"-1";return 0;}for(int i=maxa;i;--i){--f[slope[i]];h-=g[abslope[i]];for(;j<maxb&&h<w;){++j;h+=f[abslope[j]];++g[slope[j]];}if(h<w) break;ans=min((i-1)*j,ans);}cout<<ans;return 0;}
第三题:流

题意:求有向图有上下界可行流,n<=5

题解:你照着dfs5遍不就可以了?Naive!

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<ctime>#include<cmath>#include<algorithm>#include<cctype>#include<iomanip>using namespace std;inline int read(){int i=0,f=1;char ch;for(ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-') f=-1;for(;isdigit(ch);ch=getchar())i=(i<<3)+(i<<1)+(ch^48);return i*f;}struct path_to_glory{int l,h,a;}edge[20][20];int n,curflow,flow,ans,profit,inner[10],s,f;void dfs1(int pos,int nxt,int inpo);void goahead(int pos){if(n==pos){if(curflow==flow) ans=max(ans,profit);if(curflow<flow){flow=curflow;ans=profit;}return ;}dfs1(pos,pos+1,inner[pos]);return ;}void dfs(int pos,int nxt){if(curflow>flow) return ;if(nxt==n+1){goahead(pos+1);return ;}for(int i=edge[pos][nxt].l;i<=edge[pos][nxt].h;++i){inner[nxt]+=i;curflow+=i;if(i)profit+=edge[pos][nxt].a+i*i;dfs(pos,nxt+1);inner[nxt]-=i;curflow-=i;if(i)profit-=edge[pos][nxt].a+i*i;}}void dfs1(int pos,int nxt,int inpo){if(nxt==n+1&&inpo==0){goahead(pos+1);return ;}if(nxt==n+1||inpo<0) return ;for(int i=edge[pos][nxt].l;i<=edge[pos][nxt].h;++i){inner[nxt]+=i;if(i)profit+=edge[pos][nxt].a+i*i;dfs1(pos,nxt+1,inpo-i);inner[nxt]-=i;if(i)profit-=edge[pos][nxt].a+i*i;}}signed main(){flow=999999999;n=read();if(n==1){cout<<"0 0";return 0;}for(int i=1;i<=n*(n-1)/2;++i){s=read();f=read();edge[s][f].l=read();edge[s][f].h=read();edge[s][f].a=read();}dfs(1,2);if(flow==999999999) flow=ans=-1;cout<<flow<<" "<<ans;return 0;}



原创粉丝点击