1 条题解

  • 0
    @ 2025-4-12 22:03:05

    C :

    #include <stdio.h>
    
    int isObtuseTriangle(int, int, int, int, int, int);
    
    int main()
    {
    	int T, N, points[128][2], i, j, k, count;
    	
    	scanf("%d", &T);
    	while (T--){
    		
    		scanf("%d", &N);
    		if (N < 3){
    			printf("%d\n", 0);
    			continue;
    		}
    		for (i = 0; i < N; i++){
    			scanf("%d%d", &points[i][0], &points[i][1]);
    		}
    		
    		count = 0;
    		for(i = 0; i < N; i++){
    			for(j = i + 1; j < N; j++){
    				for(k = j + 1; k < N; k++){
    					count += isObtuseTriangle(points[i][0],points[i][1],
                                                  points[j][0],points[j][1],
    											  points[k][0],points[k][1]);
    				}
    			}
    		}
    		printf("%d\n", count);
    	}
    	
    	return 0;
    }
    
    int isObtuseTriangle(int x1, int y1, int x2, int y2, int x3, int y3)
    {
    	int sideSquare[3], tmp, slope[2];
    	
    	if (x1 == x2 && x1 == x3){
    		return 0;
    	}
    	slope[0] = (y2-y1)*(x3-x2);
    	slope[1] = (y3-y2)*(x2-x1);
    	if (slope[0] == slope[1]){
    		return 0;
    	}
    	
    	sideSquare[0] = (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
    	sideSquare[1] = (x1-x3)*(x1-x3)+(y1-y3)*(y1-y3);
    	sideSquare[2] = (x3-x2)*(x3-x2)+(y3-y2)*(y3-y2);
    	
    	if (sideSquare[1] > sideSquare[0]){
    		tmp = sideSquare[1];
    		sideSquare[1] = sideSquare[0];
    		sideSquare[0] = tmp;
    	}
    	if (sideSquare[2] > sideSquare[0]){
    		tmp = sideSquare[2];
    		sideSquare[2] = sideSquare[0];
    		sideSquare[0] = tmp;
    	}
    	
    	if (sideSquare[0] > (sideSquare[1] + sideSquare[2])){
    		return 1;
    	}
    	
    	return 0;
    }
    
    
    

    C++ :

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cstdlib>
    #include <cmath>
    using namespace std;
    const int V = 100 + 5;
    int n, T;
    int num[V][2];
    double len(int i, int j) {
        return sqrt(1.0 * (num[i][0] - num[j][0]) * (num[i][0] - num[j][0]) + 1.0 * (num[i][1] - num[j][1]) * (num[i][1] - num[j][1]));
    }
    bool is_ok(int i, int j, int k) {
        double a = len(i, j);
        double b = len(j, k);
        double c = len(i, k);
        double Max = max(max(a, b), c);
        double ans;
        if(Max == a)
            ans = (b * b + c * c - a * a) / (2 * b * c);
        else if(Max == b)
            ans = (a * a + c * c - b * b) / (2 * a * c);
        else
            ans = (a * a + b * b - c * c) / (2 * a * b);
        if(ans < 0.0 && fabs(ans) > 1e-6 && ans + 1.0 >= 1e-6)
            return true;
        return false;
    }
    int main() {
        int i, j, k;
       // FILE *outFile = fopen("a.out", "w");
        //FILE *inFile = fopen("a.in", "r");
       // fscanf(inFile, "%d", &T);
       scanf("%d", &T);
        while(T--) {
            int ans = 0;
          //  fscanf(inFile, "%d", &n);
          scanf("%d", &n);
            for(i = 0; i < n; ++i) {
              //  fscanf(inFile, "%d%d", &num[i][0], &num[i][1]);
                scanf("%d%d", &num[i][0], &num[i][1]);
            }
            for(i = 0; i < n; ++i)
                for(j = i + 1; j < n; ++j)
                    for(k = j + 1; k < n; ++k)
                        if(is_ok(i, j, k))
                            ans++;
           // fprintf(outFile, "%d\n", ans);
           printf("%d\n", ans);
        }
    }
    
    
    • 1

    信息

    ID
    2793
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者