洛谷 - P2789 直线交点数(数学,递归)

    技术2022-07-10  98

    题目传送 题意: 思路: 分平行线段数量递归下去即可。

    看n等于4的时候,当有俩条平行线的时候,剩下的俩条线递归到n等于2的时候(求这俩条线的交点情况),再找到总的交点数,然后判断对答案是否有增加即可。

    AC代码

    #include <bits/stdc++.h> inline long long read(){char c = getchar();long long x = 0,s = 1; while(c < '0' || c > '9') {if(c == '-') s = -1;c = getchar();} while(c >= '0' && c <= '9') {x = x*10 + c -'0';c = getchar();} return x*s;} using namespace std; #define NewNode (TreeNode *)malloc(sizeof(TreeNode)) #define Mem(a,b) memset(a,b,sizeof(a)) #define lowbit(x) (x)&(-x) const int N = 1e5 + 10; const long long INFINF = 0x7f7f7f7f7f7f7f; const int INF = 0x3f3f3f3f; const double EPS = 1e-7; const double EEE = exp(1); const int mod = 1e9+7; const double II = acos(-1); const double PP = (II*1.0)/(180.00); typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; typedef pair<ll,ll> piil; int ans,vis[5000]; void solve(int n,int m) { if(n == 0 && !vis[m]) ans++,vis[m] = 1;//当没有平行线的时候,标记交点数,答案加一 else for(int i = n;i >= 1;i--) solve(n-i,(n-i)*i + m);//现在分隔成n-i个平行线,交点数为n*(n-i) + m m为以前的交点数 //n-i条平行线与分割出来的i条线形成的交点数为(n-i)*i } signed main() { std::ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); int nn; cin >> nn; solve(nn,0);//最开始nn条平行线,0个交点 cout << ans << endl; }
    Processed: 0.010, SQL: 9