20140705总结

这次目测没有机会写解题报告了。

我就大概说一下,我的过程和我的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\n",ans);

69 }
Code testA
 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\n", s/e);

10 }
Code testB
 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 }
Code testC

你可能感兴趣的:(总结)