网易2018校园招聘编程题真题集合 详解

本文精选了八个编程挑战赛的题目并提供了详细的题解,涵盖魔法币生成策略、相反数计算、字符串碎片分析、魔法王国游历规划、数列重排、括号序列重构、合唱难度优化以及射击游戏策略,旨在提升读者的算法思维和编程技巧。

##编程题
###一、魔法币
####描述:
小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入 xxx(xxx 可以为 000)个魔法币产生更多的魔法币。
魔法机器 111:如果投入 xxx 个魔法币,魔法机器会将其变为 2x+12x+12x+1 个魔法币;
魔法机器 222:如果投入 xxx 个魔法币,魔法机器会将其变为 2x+22x+22x+2 个魔法币;
小易采购魔法神器总共需要 nnn 个魔法币,所以小易只能通过两台魔法机器产生恰好 nnn 个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有 nnn 个魔法币。
####输入描述:
输入包括一行,包括一个正整数 n(1≤n≤109)n(1 ≤ n ≤ 10^9)n(1n109),表示小易需要的魔法币数量。
####输出描述:
输出一个字符串,每个字符表示该次小易选取投入的魔法机器。其中只包含字符 ′1′'1'1′2′'2'2
####输入样例:
101010
####输出样例:
122122122

####题解:
两台机器分别可以产出 2x+12x + 12x+12x+22x + 22x+2 的魔法币,所以给一个数 nnn,一定可以有一台机器恰好生存它,所以我们可以从 nnn 开始往下拆分,如果是偶数,则使用第二台机器,否则用第一台机器,获取新的 nnn,循环这个操作,直到 n=0n = 0n=0,记录这个过程所用的机器顺序,不过这个顺序我们需要反转一下再输出,因为题目是从 000 为初始增长到 nnn 的。
####代码:

#include <bits/stdc++.h>

using namespace std;   

int n;
string res = "";

void solve()
{
    while (n > 0)
	{  
        if (n % 2 == 0)
		{  
            res += '2';  
            n = n / 2 - 1;  
        }
        else
		{  
            res += '1';  
            n = n / 2;  
        }  
    }
}

int main()
{
    cin >> n;  
    
    solve();
    
    reverse(res.begin(), res.end());
	
	cout << res << '\n';
	 
    return 0;  
}  

###二、相反数
####描述:
为了得到一个数的"相反数",我们将这个数的数字顺序颠倒,然后再加上原先的数得到"相反数"。例如,为了得到 132513251325 的"相反数",首先我们将该数的数字顺序颠倒,我们得到 523152315231,之后再加上原先的数,我们得到 5231+1325=65565231+1325=65565231+1325=6556。如果颠倒之后的数字有前缀零,前缀零将会被忽略,例如 n=100n = 100n=100, 颠倒之后是 111
####输入描述:
输入包括一个整数 n,(1≤n≤105)n,(1 ≤ n ≤ 10^5)n,(1n105)
####输出描述:
输出一个整数,表示 nnn 的相反数
####输入样例:
132513251325
####输出样例:
655665566556

####题解:
没啥可说的,根据题意,直接拆分原数然后反转合并,加上原数即可。
####代码:

#include <bits/stdc++.h>

using namespace std;   

int n;

int main()
{
    cin >> n;  
    
    int ans = n;
    int tmp = 0;
    
    while (n)
    {
    	tmp *= 10;
    	tmp += n % 10;
    	n /= 10;
	}
	
	ans += tmp;
    
    cout << ans << '\n';
	 
    return 0;  
}

###三、字符串碎片
####描述:
一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,&quot;aaabbaaac&quot;&quot;aaabbaaac&quot;"aaabbaaac" 是由下面碎片组成的:′aaa′,′bb′,′c′&#x27;aaa&#x27;,&#x27;bb&#x27;,&#x27;c&#x27;aaa,bb,c。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的平均长度是多少。
####输入描述:
输入包括一个字符串 sss,字符串 sss 的长度 length(1≤length≤50)length(1 ≤ length ≤ 50)length(1length50),sss 只含小写字母 (′a′−′z′)(&#x27;a&#x27;-&#x27;z&#x27;)(az)
####输出描述:
输出一个整数,表示所有碎片的平均长度,四舍五入保留两位小数。
如样例所示: s=&quot;aaabbaaac&quot;s = &quot;aaabbaaac&quot;s="aaabbaaac"
所有碎片的平均长度 =(3+2+3+1)/4=2.25= (3 + 2 + 3 + 1) / 4 = 2.25=(3+2+3+1)/4=2.25
####输入样例:
aaabbaaacaaabbaaacaaabbaaac
####输出样例:
2.252.252.25

####题解:
字符串长度 /// 碎片个数 === 平均长度。
####代码:

#include <bits/stdc++.h>

using namespace std;   

string s;

int main()
{
    cin >> s;  
    
    double len = s.length();
    
    char c = '?';
    int cnt = 0;
    for (int i = 0; i < s.length(); i++)
    {
    	if (s[i] != c)
    	{
    		cnt++;
    		c = s[i];
		}
	}
	
	printf("%.2f\n", len / cnt);
	
    return 0;  
}

###四、游历魔法王国
####描述:
魔法王国一共有 nnn 个城市,编号为 0∼n−10 \sim n-10n1 号,nnn 个城市之间的道路连接起来恰好构成一棵树。
小易现在在 000 号城市,每次行动小易会从当前所在的城市走到与其相邻的一个城市,小易最多能行动 LLL 次。
如果小易到达过某个城市就视为小易游历过这个城市了,小易现在要制定好的旅游计划使他能游历最多的城市,请你帮他计算一下他最多能游历过多少个城市(注意 000 号城市已经游历了,游历过的城市不重复计算)。
####输入描述:
输入包括两行,第一行包括两个正整数 n(2≤n≤50)n(2 ≤ n ≤ 50)n(2n50)L(1≤L≤100)L(1 ≤ L ≤ 100)L(1L100),表示城市个数和小易能行动的次数。
第二行包括 n−1n -1n1 个整数 parent[i](0≤parent[i]≤i)parent[i](0 ≤ parent[i] ≤ i)parent[i](0parent[i]i), 对于每个合法的 i(0≤i≤n−2)i(0 ≤ i ≤ n - 2)i(0in2),在 (i+1)(i+1)(i+1) 号城市和 parent[i]parent[i]parent[i] 间有一条道路连接。
####输出描述:
输出一个整数,表示小易最多能游历的城市数量。
####输入样例:
5 25\ 25 2
0 1 2 30\ 1\ 2\ 30 1 2 3
####输出样例:
333

####题解:
这个题并不像想象中那么复杂,是一个树上贪心的问题。

首先我们来思考一下,怎么样才能让走的点最多?
我们可以考虑从根开始走,走尽量远,期间不折返,能走多少步,也就是说树的最大深度是多少?如果树的最大深度比步数要大(默认根的深度为 000),那么我们就只能游历 L+1L + 1L+1 个城市;否则,我们能够将多余的步数用来访问其他城市,不过这些城市访问后需要折返,折返回这个能够到达最大深度的路径上,此时,按道理我们可以访问 mx_dep+(L−mx_dep)/2+1mx\_dep + (L - mx\_dep) / 2 + 1mx_dep+(Lmx_dep)/2+1 个城市,不过如果这个值大于 NNN,那么我们只能不用完所有步数,而输出一个 NNN,否则输出 mx_dep+(L−mx_dep)/2+1mx\_dep + (L - mx\_dep) / 2 + 1mx_dep+(Lmx_dep)/2+1

此时,就剩下一个问题了,如何求深度,最直观的解法是 dfsdfsdfs 遍历一遍树,不过这个题有一个十分强的条件,0≤parent[i]≤i0 ≤ parent[i] ≤ i0parent[i]ii+1i + 1i+1 的父节点是 parent[i]parent[i]parent[i],那么在输入过程中,我们可以直接根据父节点的深度加一来获取该节点深度,因为此时父节点的深度我们一定知道。
####代码:

#include <bits/stdc++.h>

using namespace std;   

const int MAXN = 55;

int N, L;
int dep[MAXN];

int main()
{
    cin >> N >> L;
    
    int par, mx_dep = 1;
    for (int i = 1; i < N; i++)
    {
    	cin >> par;
    	dep[i] = dep[par] + 1;
    	if (dep[i] > mx_dep)
    	{
    		mx_dep = dep[i];
		}
	}
	
	if (mx_dep < L)
	{
		int tmp = mx_dep + (L - mx_dep) / 2 + 1;
		if (tmp > N)
		{
			cout << N << '\n';
		}
		else
		{
			cout << tmp << '\n';
		}
	}
	else
	{
		cout << L + 1 << '\n';
	}
	
    return 0;  
}

###五、重排数列
####描述:
小易有一个长度为 NNN 的正整数数列 A=A[1],A[2],A[3]...,A[N]A = {A[1], A[2], A[3]..., A[N]}A=A[1],A[2],A[3]...,A[N]
牛博士给小易出了一个难题:
对数列 AAA 进行重新排列,使数列A满足所有的 A[i]∗A[i+1](1≤i≤N−1)A[i] * A[i + 1](1 ≤ i ≤ N - 1)A[i]A[i+1](1iN1) 都是 444 的倍数。
小易现在需要判断一个数列是否可以重排之后满足牛博士的要求。
####输入描述:
输入的第一行为数列的个数 t(1≤t≤10)t(1 ≤ t ≤ 10)t(1t10),
接下来每两行描述一个数列 AAA,第一行为数列长度 n(1≤n≤105)n(1 ≤ n ≤ 10^5)n(1n105)
第二行为 nnn 个正整数 A[i](1≤A[i]≤109)A[i](1 ≤ A[i] ≤ 10^9)A[i](1A[i]109)
####输出描述:
对于每个数列输出一行表示是否可以满足牛博士要求,如果可以输出 YesYesYes,否则输出 NoNoNo
####输入样例:
2
3
1 10 100
4
1 2 3 4
####输出样例:
Yes
No

####题解:
分别计数,奇数个数 aaa、四倍数个数 bbb、非四倍数的二倍数个数 ccc

如果说 c&gt;0c &gt; 0c>0,需要将偶数从一端挨个排列,然后另一端四倍数与奇数交替排列,所以 aaa 不多于 bbb 时,YesYesYes,反之,NoNoNo
如果说 c==0c == 0c==0,则需要将奇数与四倍数交替排列,所以 aaa 不多于 b+1b + 1b+1 时,YesYesYes,反之,NoNoNo
####代码:

#include <bits/stdc++.h>

using namespace std;   

int T, N;

int main()
{
	cin >> T;
	
	while (T--)
	{
		cin >> N;
	
		int Odd_cnt = 0;
		int Mul4_cnt = 0;
		int Mul2Not4_cnt = 0;
		int x;
		for (int i = 0; i < N; i++)
		{
			scanf("%d", &x);
			if (x & 1)
			{
				Odd_cnt++;
			}
			else if (x % 4 == 0)
			{
				Mul4_cnt++;
			}
			else
			{
				Mul2Not4_cnt++;
			}
		}
	
		if (Mul2Not4_cnt)
		{
			if (Odd_cnt > Mul4_cnt)
			{
				cout << "No" << '\n';
			}
			else
			{
				cout << "Yes" << '\n';
			}
		}
		else
		{
			if (Odd_cnt > Mul4_cnt + 1)
			{
				cout << "No" << '\n';
			}
			else
			{
				cout << "Yes" << '\n';
			}
		}
	}
	
    return 0;  
}

###六、最长公共子括号序列
####描述:
一个合法的括号匹配序列被定义为:

  1. 空串 &quot;&quot;&quot;&quot;"" 是合法的括号序列
  2. 如果 &quot;X&quot;&quot;X&quot;"X"&quot;Y&quot;&quot;Y&quot;"Y" 是合法的序列,那么 &quot;XY&quot;&quot;XY&quot;"XY" 也是一个合法的括号序列
  3. 如果 &quot;X&quot;&quot;X&quot;"X" 是一个合法的序列,那么 &quot;(X)&quot;&quot;(X)&quot;"(X)" 也是一个合法的括号序列
  4. 每个合法的括号序列都可以由上面的规则生成
    例如 &quot;&quot;,&quot;()&quot;,&quot;()()()&quot;,&quot;(()())&quot;,&quot;(((()))&quot;&quot;&quot;, &quot;()&quot;, &quot;()()()&quot;, &quot;(()())&quot;, &quot;(((()))&quot;"","()","()()()","(()())","(((()))" 都是合法的。
    从一个字符串 SSS 中移除零个或者多个字符得到的序列称为 SSS 的子序列。
    例如 &quot;abcde&quot;&quot;abcde&quot;"abcde" 的子序列有 &quot;abe&quot;,&quot;&quot;,&quot;abcde&quot;&quot;abe&quot;,&quot;&quot;,&quot;abcde&quot;"abe","","abcde" 等。
    定义 LCS(S,T)LCS(S,T)LCS(S,T) 为字符串 SSS 和字符串 TTT 最长公共子序列的长度,即一个最长的序列 WWW 既是 SSS 的子序列也是 TTT 的子序列的长度。
    小易给出一个合法的括号匹配序列 sss,小易希望你能找出具有以下特征的括号序列 ttt:
    1、tttsss 不同,但是长度相同
    2、ttt 也是一个合法的括号匹配序列
    3、LCS(s,t)LCS(s, t)LCS(s,t) 是满足上述两个条件的t中最大的
    因为这样的 ttt 可能存在多个,小易需要你计算出满足条件的 ttt 有多少个。

如样例所示: s=&quot;(())()&quot;s = &quot;(())()&quot;s="(())()",跟字符串 sss 长度相同的合法括号匹配序列有:
&quot;()(())&quot;,&quot;((()))&quot;,&quot;()()()&quot;,&quot;(()())&quot;&quot;()(())&quot;, &quot;((()))&quot;, &quot;()()()&quot;, &quot;(()())&quot;"()(())","((()))","()()()","(()())",其中 LCS(&quot;(())()&quot;,&quot;()(())&quot;)LCS( &quot;(())()&quot;, &quot;()(())&quot; )LCS("(())()","()(())")444,其他三个都为 555,所以输出 333.
####输入描述:
输入包括字符串 s(4≤∣s∣≤50,∣s∣s(4 ≤ |s| ≤ 50,|s|s(4s50,s 表示字符串长度),保证 sss 是一个合法的括号匹配序列。
####输出描述:
输出一个正整数,满足条件的 ttt 的个数。
####输入样例:
(())()(())()(())()
####输出样例:
333

####题解:
假如说,初始合法括号匹配序列长度为 lenlenlen,那么最大 LCSLCSLCS 一定是 len−1len - 1len1,那么我们如何凑 LCSLCSLCS 结果为 len−1len - 1len1 的序列呢?

其实这个并不难,我们可以抽出一个括号然后插入到别的地方,如果说抽出插入后的括号序列不同于原序列并且是合法的括号匹配序列,那么这就是我们所要找的序列之一。

这里还有一个问题便是,如果我们直接输出有多少种合法的抽出插入的方案,那么就会存在重复计算的可能,因为有的方案虽然不一样,但是最后获得的序列可能会一样,所以我们采用 mapmapmap 存储一下已找到的合法序列,最后输出有多少个不同的合法序列即可。
####代码:

#include <bits/stdc++.h>

using namespace std;   

int len;
string s;
map<string, int> msi;

bool charge(string str)
{
	int tag = 0;
	for (int i = 0; i < len; i++)
	{
		if (str[i] == '(')
		{
			tag++;
		}
		else
		{
			tag--;
		}
		
		if (tag < 0)
		{
			return false;
		}
	}
	
	return true;
}

int main()
{
	cin >> s;
	len = s.size();
	
	for (int i = 0; i < len; i++)
	{
		//	抽出第 i 个括号 
		string tmp = s.substr(0, i) + s.substr(i + 1, len - i - 1);
		for (int j = 0; j < len; j++)
		{
			string tep = tmp.substr(0, j) + s[i] + tmp.substr(j, len - j - 1);
			if (tep != s && charge(tep))
			{
				msi[tep] = 1;
			}
		}
	}
	
	cout << msi.size() << '\n';
	
	return 0;
}

###七、合唱
####描述:
QQQ 和牛博士合唱一首歌曲,这首歌曲由 nnn 个音调组成,每个音调由一个正整数表示。
对于每个音调要么由小 QQQ 演唱要么由牛博士演唱,对于一系列音调演唱的难度等于所有相邻音调变化幅度之和, 例如一个音调序列是 8,8,13,128, 8, 13, 128,8,13,12, 那么它的难度等于 ∣8−8∣+∣13−8∣+∣12−13∣=6|8 - 8| + |13 - 8| + |12 - 13| = 688+138+1213=6 (其中 ∣∣|| 表示绝对值)。
现在要对把这 nnn 个音调分配给小 QQQ 或牛博士,让他们演唱的难度之和最小,请你算算最小的难度和是多少。

如样例所示: 小 QQQ 选择演唱 5,6{5, 6}5,6 难度为 111, 牛博士选择演唱 1,2,1{1, 2, 1}1,2,1 难度为 222,难度之和为 333,这一个是最小难度和的方案了。
####输入描述:
输入包括两行,第一行一个正整数 n(1≤n≤2000)n(1 ≤ n ≤ 2000)n(1n2000) 第二行 nnn 个整数 v[i](1≤v[i]≤106)v[i](1 ≤ v[i] ≤ 10^6)v[i](1v[i]106), 表示每个音调。
####输出描述:
输出一个整数,表示小 QQQ 和牛博士演唱最小的难度和是多少。
####输入样例:
555
1 5 6 2 11\ 5\ 6\ 2\ 11 5 6 2 1
####输出样例:
333

####题解:
典型的动态规划问题。

dp[i][j]dp[i][j]dp[i][j] 表示当前演唱的人唱到第 iii 个,另一个人演唱到第 jjj 个,当 j&lt;i−1j &lt; i - 1j<i1 时,说明唱第 iii 个调时没有换人,所以可以直接从 dp[i−1][j]dp[i - 1][j]dp[i1][j] 转移过来;当 j=i−1j = i - 1j=i1 时,说明此时切换人了,但是我们并不知道当前演唱的人上一次什么时候演唱,所以我们需要枚举他上次演唱的位置,取最小来转移。

所以状态转移方程为:
dp[i][j]=dp[i−1][j]+abs(v[i]−v[i−1]),j&lt;i−1dp[i][j] = dp[i-1][j] + abs(v[i] - v[i-1]), j &lt; i - 1dp[i][j]=dp[i1][j]+abs(v[i]v[i1]),j<i1
dp[i][i−1]=min(dp[i−1][k]+abs(v[i]−v[k])),k&lt;i−1dp[i][i -1] = min(dp[i-1][k] + abs(v[i] - v[k])), k &lt; i - 1dp[i][i1]=min(dp[i1][k]+abs(v[i]v[k])),k<i1

初始情况(边界情况)是若当前有 iii 个音调,可以让一个人只唱第一个或最后一个音调,剩下的音调都由另一个人唱:
dp[i][0]=dp[i−1][0]+abs(v[i]−v[i−1]),i≥2dp[i][0] = dp[i-1][0] + abs(v[i] - v[i-1]), i ≥ 2dp[i][0]=dp[i1][0]+abs(v[i]v[i1]),i2
dp[i][i−1]=dp[i−1][i−2]+abs(v[i−1]−v[i−2]),i≥2dp[i][i-1] = dp[i-1][i-2] + abs(v[i-1] - v[i-2]), i ≥ 2dp[i][i1]=dp[i1][i2]+abs(v[i1]v[i2]),i2

####代码:

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 2222;
const int INF = 0x3f3f3f3f;

int n;
int val[MAXN];
int dif[MAXN]; 
int dp[MAXN][MAXN];

int main()
{
	scanf("%d%d", &n, val);
	for (int i = 1; i < n; i++)
	{
		scanf("%d", val + i);
		dif[i] = abs(val[i] - val[i - 1]);
	} 
	
	int res = INF;
	for (int i = 2; i < n; i++)
	{
//		dp[i][0] = dp[i - 1][0] + dif[i];
		dp[i][i - 1] = dp[i - 1][i - 2] + dif[i - 1];
	}
	for (int i = 2; i < n; i++)
	{
		for (int j = 0; j < i - 1; j++)
		{
			dp[i][j] = dp[i - 1][j] + dif[i];
			dp[i][i - 1] = min(dp[i][i - 1], dp[i - 1][j] + abs(val[i] - val[j]));
		}
	}
	
	int ans = INF;
	for (int i = 0; i < n - 1; i++)
	{
		ans = min(ans, dp[n - 1][i]);
	}
	cout << ans << '\n';
	
	return 0;
}

###八、射击游戏
####描述:
小易正在玩一款新出的射击游戏,这个射击游戏在一个二维平面进行,小易在坐标原点 (0,0)(0,0)(0,0),平面上有 nnn 只怪物,每个怪物有所在的坐标 (x[i],y[i])(x[i], y[i])(x[i],y[i])。小易进行一次射击会把 xxx 轴和 yyy 轴上(包含坐标原点)的怪物一次性消灭。
小易是这个游戏的 VIPVIPVIP 玩家,他拥有两项特权操作:
111、让平面内的所有怪物同时向任意同一方向移动任意同一距离
222、让平面内的所有怪物同时对于小易 (0,0)(0,0)(0,0) 旋转任意同一角度
小易要进行一次射击。小易在进行射击前,可以使用这两项特权操作任意次。
小易想知道在他射击的时候最多可以同时消灭多少只怪物,请你帮帮小易。

如样例所示:

描述

所有点对于坐标原点 (0,0)(0,0)(0,0) 顺时针或者逆时针旋转 45°45°45°,可以让所有点都在坐标轴上,所以 555 个怪物都可以消灭。

####输入描述:
输入包括三行。
第一行中有一个正整数 n(1≤n≤50)n(1 ≤ n ≤ 50)n(1n50),表示平面内的怪物数量。
第二行包括 nnn 个整数 x[i](−1,000,000≤x[i]≤1,000,000)x[i](-1,000,000 ≤ x[i] ≤ 1,000,000)x[i](1,000,000x[i]1,000,000),表示每只怪物所在坐标的横坐标,以空格分割。
第二行包括 nnn 个整数 y[i](−1,000,000≤y[i]≤1,000,000)y[i](-1,000,000 ≤ y[i] ≤ 1,000,000)y[i](1,000,000y[i]1,000,000),表示每只怪物所在坐标的纵坐标,以空格分割。
####输出描述:
输出一个整数表示小易最多能消灭多少只怪物。
####输入样例:
555
0 −1 1 1 −10\ -1\ 1\ 1\ -10 1 1 1 1
0 −1 −1 1 10\ -1\ -1\ 1\ 10 1 1 1 1
####输出样例:
555

####题解:
首先,我们知道,小易的攻击方式十字型攻击,其次我们知道,同时操作所有点等价于操作小易,所以我们可以将两种操作看做小易可以移动到图中任意点并且可以调整任意攻击角度。

那么我们要寻找的就是一个能够攻击最多的位置及攻击角度,也就是说,我们在寻找一个能够覆盖最多点的十字型。

此时,问题已经十分清晰了,那么怎么找这个十字呢?

首先我们知道任意三个不共线的点可以确定三个十字,如果取两个点连线另一个作垂线便可以确定一个十字,那么我们只需要枚举剩下 n−3n - 3n3 个点是否在这个十字上即可,判断是否在十字上也十分简单,运用数学中判断平行与垂直的公式。比方说,确定 ABABAB 作直线,CCCABABAB 垂线,判断点 DDD 是否在十字上只需要判断 ADADAD 是否平行 ABABAB(如果平行则重合)、CDCDCD 是否垂直 ABABAB(如果垂直则与垂线重合)。

总的来说,外三层循环确定十字,内层循环判断是否被十字覆盖,一共四层循环,复杂度 O(N4)O(N^4)O(N4)
####代码:

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 55;

int n;

struct point 
{  
    int x, y;  
} p[MAXN];
  
int main()  
{
    cin >> n;
    for (int i = 0; i < n; ++i)  
    {  
        cin >> p[i].x;  
    }  
    for (int i = 0; i < n; ++i)  
    {  
        cin >> p[i].y;  
    }
    
    if (n <= 3)  
    {  
        cout << n << endl;  
        return 0;
    }
    
    int ans = 3;  
    for (int i = 0; i < n; ++i)  
    {  
        for (int j = 0; j < n; ++j)  
        {  
            if (j == i)  
            {
            	continue;
        	}
        	
            for (int k = 0; k < n; ++k)  
            {  
                if (k == i || k == j)  
                {
					continue;
				}
				
                int cnt = 3;  
                for (int l = 0; l < n; ++l)  
                {  
                    if (l == i || l == j || l == k)
					{
						continue;
					}  
                    
                    if ((p[l].x - p[i].x) * (p[l].y - p[j].y) == (p[l].y - p[i].y) * (p[l].x - p[j].x))  
                    {  
                        cnt++;  
                    }  
                    else if ((p[l].x - p[k].x) * (p[i].x - p[j].x) + (p[l].y - p[k].y) * (p[i].y - p[j].y) == 0)  
                    {  
                        cnt++;
                    }
                }
                
            	ans = max(ans, cnt);  
            }  
        }  
    }
    
    cout << ans << endl;
    
	return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值