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 }
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 }