2017 world final

E

解题关键:二分时注意C函数的单调性。

 

 1 #include<bits/stdc++.h>
 2 #define eps 1e-8
 3 #define INF 0x3f3f3f3f
 4 using namespace std;
 5 typedef long long ll;
 6 double a[1000002],b[1000002];
 7 int n,m;
 8 double solve(){
 9     double l=-INF,r=1e9,mid;
10     for(int i=0;i<n;i++) l=max(l,-b[i]);
11     for(int i=0;i<10000;i++){
12         mid=(l+r)/2;
13         double sum=0.0;
14         for(int j=0;j<n;j++){
15             sum+=a[j]/(mid+b[j]);
16         }
17         if(sum-m>0) l=mid;
18         else r=mid; 
19     }
20     return r;
21 }
22 int main(){
23     cin>>n>>m;
24     for(int i=0;i<n;i++) cin>>a[i]>>b[i];
25     double ans=solve();
26     printf("%.8lf\n",ans);
27 } 
E

I

解题关键:运用floyd求各点连通性

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 char t1,t2;
 5 int c[26][26];
 6 string s1,s2;
 7 int main(){
 8     int n,m;
 9     cin>>n>>m;
10     for(int i=0;i<26;i++){
11         c[i][i]=1;
12     }
13     for(int i=0;i<n;i++){
14         cin>>t1>>t2;
15         c[t1-'a'][t2-'a']=1;
16     }
17     for(int k=0;k<26;k++){
18         for(int i=0;i<26;i++){
19             for(int j=0;j<26;j++){
20                 c[i][j]=max(c[i][j],c[i][k]&c[k][j]);
21             }
22         }
23     }
24     for(int i=0;i<m;i++){
25         cin>>s1>>s2;
26         if(s1.size()!=s2.size()){ printf("no\n");continue;} 
27         int len=s1.size();
28         bool flag=false;
29         for(int j=0;j<len;j++){
30             if(c[s1[j]-'a'][s2[j]-'a']==0){ flag=true;break;} 
31         }
32         if(flag) printf("no\n");
33         else printf("yes\n");
34     }
35     
36 }
I

 

posted @ 2017-05-25 22:57  Elpsywk  阅读(297)  评论(0编辑  收藏  举报