标签: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 }
标签:c++ int min -- str ast pac 个人 line
原文地址:http://www.cnblogs.com/wcz112/p/6279822.html