题意:有一个n个点的完全图,要求若是三个点之间的边可以组成三角形就删去此边,直到边的总数小于点的总数即完成操作,输出操作次数和每次选择的三个顶点。
思路:将问题转换成三个数的组合问题,保证每次组合的三个数两两之间仅出现一次即成立。
accode:
#include <iostream>
#include <stdio.h>
using namespace std;
typedef long long ll;
int main()
{
int n, ans;
scanf("%d", &n);
ans = (n * n - 3 * n)/ 6 + 1;//由删掉的边数算三角形个数
printf("%d\n", ans);
//保证i, j, k两两之间只出现过一次
for(int i = 1; i < n; i++)
{
for(int j = i + 1; j < n; j++)
{
int k = n - i - j;
if(k <= 0) k += n;
if(k > j)
{
printf("%d %d %d\n", i, j, k);
}
}
}
return 0;
}