这次目测没有机会写解题报告了。
我就大概说一下,我的过程和我的WAcode。
第一题,我一直觉得自己是正解,然后莫名其妙wa了。我也想到了二分答案,然后枚举边。但是我觉得我的二分跟翔一样,然后我又觉得自己的枚举边+枚举点是对的。所以就没写二分。。。(┬_┬) o(╯□╰)o 我的做法是枚举一条边,然后枚举一个点,比较它到两个点的距离,维护到较小值的端点的较小值的最大值,然后寻找边上哪一点的最大值最小。。
第二题 看了一下题,觉得是最长上升子序列,就是说如果ai=bj=bk 那么我一定会删除下标较小的。。然后开始二分e??又是二分??
第三题 应该是dp,dp[i]表示gcd为i至少要多少个数,转移方程显而易见:dp[gcd(i,am)]=min(*,dp[i]+1);
最后总结一下这次考试,我悟出了七字真言:
黑暗算法平安保!
完结,撒花。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int a[201][201]; 6 int b[201][201]; 7 int dis[201]; 8 int N,M; 9 int U,V,W; 10 int main() 11 { 12 double ans=1E9; 13 memset(a,-1,sizeof(a)); 14 memset(b,-1,sizeof(b)); 15 freopen("testA.in","r",stdin); 16 freopen("testA.out","w",stdout); 17 cin>>N>>M; 18 for(int i=1;i<=N;i++) 19 { 20 a[i][i]=0; 21 b[i][i]=0; 22 } 23 for(int i=1;i<=M;i++) 24 { 25 scanf("%d%d%d",&U,&V,&W); 26 if(a[U][V]!=-1) 27 { 28 a[U][V]=min(a[U][V],W); 29 a[V][U]=min(a[V][U],W); 30 b[U][V]=min(b[U][V],W); 31 b[V][U]=min(b[V][U],W); 32 } 33 else 34 { 35 a[U][V]=W; 36 a[V][U]=W; 37 b[U][V]=W; 38 b[V][U]=W; 39 } 40 } 41 for(int k=1;k<=N;k++) 42 for(int i=1;i<=N;i++) 43 for(int j=1;j<=N;j++) 44 if((a[i][k]!=-1)&&(a[k][j]!=-1)&&(a[i][j]==-1||a[i][j]>a[i][k]+a[k][j])) 45 { 46 a[i][j]=a[i][k]+a[k][j]; 47 } 48 long long x=0,y=0; 49 for(int i=1;i<=N;i++) 50 for(int j=i+1;j<=N;j++) 51 if(b[i][j]!=-1) 52 { 53 x=0,y=0; 54 for(int k=1;k<=N;k++) 55 { 56 if(a[i][k]!=-1&&(a[i][k]<a[k][j]||a[k][j]==-1)&&x<a[i][k]) 57 x=a[i][k]; 58 if(a[j][k]!=-1&&(a[j][k]<a[k][i]||a[k][i]==-1)&&y<a[j][k]) 59 y=a[j][k]; 60 } 61 if(x-y>b[i][j]&&ans>(x)) 62 ans=(double)(x); 63 if(y-x>b[i][j]&&ans>(y)) 64 ans=(double)(y); 65 if(x-y<=b[i][j]&&y-x<=b[i][j]&&ans>((x+y+b[i][j])/2)) 66 ans=(double)(x+y+b[i][j])/2; 67 } 68 printf("%.2lf ",ans); 69 }
1 #include<cstdio> 2 using namespace std; 3 int main() 4 { 5 int n,m,s,e; 6 freopen("testB.in","r",stdin); 7 freopen("testB.out","w",stdout); 8 scanf("%d %d %d %d", &n, &m, &s, &e); 9 printf("%d ", s/e); 10 }
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int a[1000]; 5 int gcd(int a,int b) 6 { 7 while(b!=0) 8 { 9 a%=b; 10 a^=b; 11 b^=a; 12 a^=b; 13 } 14 return a; 15 } 16 int main() 17 { 18 int n; 19 freopen("testC.in","r",stdin); 20 freopen("testC.out","w",stdout); 21 cin>>n; 22 for(int i=1;i<=n;i++) 23 cin>>a[i]; 24 int k=a[1]; 25 int m; 26 for(int i=2;i<=n;i++) 27 { 28 m=a[i]; 29 k=gcd(k,m); 30 } 31 long long ans=0; 32 for(int i=1;i<=m;i++) 33 if(k==a[i]) 34 ans=n-1; 35 if(ans==n-1) 36 { 37 cout<<ans<<endl; 38 return 0; 39 } 40 for(int i=1;i<=m;i++) 41 for(int j=1;j<=m;j++) 42 if(k==gcd(a[i],a[j])) 43 ans=n-2; 44 cout<<ans<<endl; 45 return 0; 46 }