码迷,mamicode.com
首页 > 其他好文 > 详细

xjoi省选模拟赛_14

时间:2017-01-12 23:12:41      阅读:504      评论:0      收藏:0      [点我收藏+]

标签:c++   int   min   --   str   ast   pac   个人   line   

技术分享

T1 发现 对于当前 投出 奇数次向上的概率为 p 那么 若加入一个 pi=0.5 的骰子 

发现  p奇 +1=p奇 * 0.5+p * 0.5 = p偶+1  也就是说 只要方案中存在一个 p=0.5 的骰子

这个方案必然合法  :

 1 #include <bits/stdc++.h>
 2 #define N 100
 3 #define eps 1e-7
 4 using namespace std;
 5 typedef long double ldb;
 6 int t,n;
 7 ldb A[N];
 8 int main()
 9 {
10     scanf("%d",&t);
11     while(t--)
12     {
13         scanf("%d",&n);
14         for(int i=1;i<=n;i++)
15             scanf("%Lf",&A[i]);
16         int tot1=0;
17         for(int i=1;i<=n;i++)
18             if(fabs(A[i]-0.5)>eps) tot1++;
19         printf("%lld\n",(1ll<<n)-(1ll<<tot1));
20     }
21     return 0;
22 }

 

技术分享

 

三分 次数 贪心 天数 || 二分天数 三分次数判断是否合法

我选择前者 但是我并不会证 求大爷带带我

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 inline ll read()
 5 {
 6     ll x=0,f=1;char ch=getchar();
 7     while(ch<0||ch>9){if(ch==-)f=-1;ch=getchar();}
 8     while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
 9     return x*f;
10 }
11 struct food
12 {
13     ll p,s;
14 }a[500],b[500];
15 ll t,n,m,f;
16 int tot;
17 inline bool cmp1(const food&a,const food&b)
18 {
19     return (a.s==b.s)? a.p<b.p:a.s<b.s;
20 }
21 inline bool cmp2(const food&a,const food&b)
22 {
23     return a.p<b.p;
24 }
25 ll get(ll x)
26 {
27     ll left=m-x*f,ans=0,tmp,now=0;
28     if(left<0) return 0;
29     for(int i=1;i<=tot;i++)
30     {
31         ll s=b[i].s,p=b[i].p;
32         if(now<=s) tmp=min(s-now+1,left/(p*x)),ans+=tmp*x,left-=p*x*tmp,now+=tmp;
33         if(now<=s) tmp=min(x,left/p),ans+=tmp,left-=p*tmp,now++;
34     }
35     return ans;
36 }
37 int main()
38 {
39     m=read();f=read();n=read();
40     for(int i=1;i<=n;i++)
41         a[i].p=read(),a[i].s=read();
42     sort(a+1,a+1+n,cmp1);b[1]=a[1];tot=1;
43     for(int i=1;i<=n;i++)
44         if(a[i].s>b[tot].s) b[++tot]=a[i];
45     sort(b+1,b+1+tot,cmp2);
46     if(f+a[1].p>m)
47     {
48         printf("0\n");
49         return 0;
50     }
51     ll l=1,r=m/(b[1].p+f),ans=max(get(l),get(r));
52     while(l+20<r)
53     {
54         ll tot=(r-l+1);
55         ll ansl=get(l+tot/3),ansr=get(l+2*tot/3);
56         if(ansl<ansr) ans=max(ansl,ans),l=l+tot/3+1;
57         else ans=max(ansr,ans),r=l+tot*2/3-1;
58     }
59     for(int i=l;i<=r;i++)
60         ans=max(ans,get(i));
61     printf("%lld\n",ans);
62     return 0;
63 }

 

技术分享

模拟退火(进水?????)  Awd 大爷写了 禁忌搜索(全机房 我指507 就他一个人会)

 1 #include <bits/stdc++.h>
 2   
 3 using namespace std;
 4 typedef double ldb;
 5 int n,A[55][55],vis[55],last,cnt;
 6 ldb ans;
 7 ldb dd(int x)
 8 {
 9     int g[55];g[0]=0;
10     ldb tmp=0;
11     for(int i=0;i<n;i++) if(x&(1<<i)) g[++g[0]]=i+1;
12     for(int i=1;i<=g[0];i++)
13         for(int j=i+1;j<=g[0];j++)
14             tmp+=(ldb)A[g[i]][g[j]];
15     return tmp/(ldb)(g[0]*(200-g[0]));
16 }
17 void solve()
18 {
19     double t=1.0;
20     while(t>0.00000001)
21     {
22         int p=rand()%2;
23         if(!p)
24         {
25             if(!cnt) continue;
26             int x=rand()%n+1;
27             if(!vis[x]) continue; int rel=0;
28             for(int i=1;i<=n;i++) if(vis[i]) rel+=A[x][i];
29             double tmp=last-rel;
30             if(ans<tmp/double(cnt-1)/double(201-cnt)||double(rand()%10000)/10000.0<t)
31                 last=tmp,ans=tmp/double(cnt-1)/double(201-cnt),cnt--,vis[x]=0;
32         }
33         else
34         {
35             int x=rand()%n+1;
36             if(vis[x]) continue;int rel=0;
37             for(int i=1;i<=n;i++) if(vis[i]) rel+=A[x][i];
38             double tmp=last+rel;
39             if(ans<tmp/double(cnt+1)/double(199-cnt)||double(rand()%10000/10000.0<t))
40                 last=tmp,ans=tmp/double(cnt+1)/double(199-cnt),cnt++,vis[x]=1;
41         }
42         t*=0.99999;
43     }
44     printf("%.5lf\n",ans);
45 }
46 int main()
47 {
48     srand(time(0));
49     scanf("%d",&n);
50     for(int i=1;i<=n;i++)
51         for(int j=1;j<=n;j++)
52             scanf("%d",&A[i][j]);
53     if(n<=15)
54     {
55         for(int i=0;i<(1<<15);i++)
56             ans=max(ans,dd(i));
57         printf("%.5lf\n",ans);
58     }
59     else solve();
60     return 0;
61 }

 

xjoi省选模拟赛_14

标签:c++   int   min   --   str   ast   pac   个人   line   

原文地址:http://www.cnblogs.com/wcz112/p/6279822.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!