zoukankan      html  css  js  c++  java
  • 3月30日

    早上的开题答辩似乎是很水的样子,不过好像班上还是有一个人没通过,最后竟然发现我们这组的大boss是王伟,然后就没有然后了QAQ

    poj3256

    题意:有k头牛,n个顶点,m条路径,第i头牛从t[i]出发,问有多少个点是所有牛都可以到达的

    分析:就是统计每一个顶点会被访问几次,若访问的次数正好等于k,则就是n头牛都可以到达的顶点

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <string>
     5 #include <vector>
     6 #include <algorithm>
     7 #include <set>
     8 #include <map>
     9 #include <bitset>
    10 #include <cmath>
    11 #include <queue>
    12 #include <stack>
    13 using namespace std;
    14 const int maxn=1010;
    15 int k,n,m;
    16 int t[100];   //记录每次的开始位置
    17 int g[maxn][maxn]; //记录两点之间是否相互可达
    18 int flag[maxn];  //标记访问过的点
    19 int vis[maxn];  //标记这个点被访问了几次
    20 void dfs(int h)
    21 {
    22     flag[h]=1;
    23     vis[h]++;
    24     for(int i=1;i<=n;i++)
    25     {
    26         if(!flag[i]&&g[h][i])
    27             dfs(i);
    28     }
    29 }
    30 int main()
    31 {
    32     while(cin>>k>>n>>m)
    33     {
    34         for(int i=0;i<k;i++)
    35             scanf("%d",&t[i]);
    36         memset(g,0,sizeof(g));
    37         for(int i=0;i<m;i++)
    38         {
    39             int x,y;
    40             scanf("%d%d",&x,&y);
    41             g[x][y]=1;
    42         }
    43         memset(vis,0,sizeof(vis));
    44         for(int i=0;i<k;i++)
    45         {
    46             memset(flag,0,sizeof(flag));
    47             dfs(t[i]);
    48         }
    49         int cnt=0;
    50         for(int i=1;i<=n;i++)
    51         {
    52             if(vis[i]==k)
    53                 cnt++;
    54         }
    55         cout<<cnt<<endl;
    56     }
    57     return 0;
    58 }
    我的代码

     poj2362

    题意:有n个数,问是否能构成正方形

    分析:只要能构成正方形的三边即可构成正方形,剪枝+dfs,若总长度不能被4整除,或者有一边的长度大于总长度的四分之一均不行,剪枝,然后对于剩下的情况按照按照数的从小到大进行排序,之后逆向进行dfs,这样做的目的是可以更快找到相应的边

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <string>
     5 #include <vector>
     6 #include <algorithm>
     7 #include <set>
     8 #include <map>
     9 #include <bitset>
    10 #include <cmath>
    11 #include <queue>
    12 #include <stack>
    13 using namespace std;
    14 const int maxn=25;
    15 int a[maxn],vis[maxn];
    16 int n,cnt;
    17 bool dfs(int pos,int len,int step)
    18 {
    19     if(step==3) return true;
    20     for(int i=pos;i>=0;i--) //逆序更快
    21     {
    22         if(!vis[i])
    23         {
    24             vis[i]=1;
    25             if(len+a[i]<cnt){
    26                 if(dfs(i-1,len+a[i],step)) return true;
    27             }else if(len+a[i]==cnt)
    28             {
    29                 if(dfs(n-1,0,step+1)) return true;
    30             }
    31             vis[i]=0;
    32         }
    33     }
    34     return false;
    35 }
    36 int main()
    37 {
    38     int t;
    39     cin>>t;
    40     while(t--)
    41     {
    42         cin>>n;
    43         memset(a,0,sizeof(a));
    44         int sum=0;
    45         for(int i=0;i<n;i++)
    46         {
    47             cin>>a[i];
    48             sum+=a[i];
    49         }
    50         memset(vis,0,sizeof(vis));
    51         sort(a,a+n);
    52         if(sum%4||a[n-1]>sum/4)
    53         {
    54             cout<<"no"<<endl;
    55             continue;
    56         }
    57         cnt=sum/4;
    58         if(dfs(n-1,0,0))
    59             cout<<"yes"<<endl;
    60         else
    61             cout<<"no"<<endl;
    62     }
    63     
    64     return 0;
    65 }
    我的代码
  • 相关阅读:
    11. Container With Most Water
    9. Palindrome Number
    375. 猜数字大小 II leetcode java
    leetcode 72 编辑距离 JAVA
    73. 矩阵置零 leetcode JAVA
    快速排序 JAVA实现
    63. 不同路径 II leetcode JAVA
    重写(override)与重载(overload)
    62 不同路径 leetcode JAVA
    leetcode 56 合并区间 JAVA
  • 原文地址:https://www.cnblogs.com/wolf940509/p/5338962.html
Copyright © 2011-2022 走看看