期中考前练习题

2023-11-14 09:19 至 2023-11-14 18:30
时长: 9小时10分钟59秒

已有5人报名

比赛说明

310宿舍专用
                    ——by刘嘉俊
//----------T1参考代码:-------------

#include <stdio.h>
#include <cmath>
#include<iostream>
using namespace std;
int main(){
	double x[5], y[5];
    int K[7][2] = { 0,0, 1,2, 1,3, 1,4, 2,3, 2,4, 3,4 };//第i条线段由哪两个点组成
	int T; scanf("%d",&T);
	while(T--){
        for(int i=1;i<=4;i++)
            cin >> x[i] >> y[i];
        
        double Line[7][2];
        for(int i=1, n=1;i<=4;i++)
            for(int k=i+1;k<=4;k++,n++)
                Line[n][0] = (x[i]+x[k])/2, Line[n][1] = (y[i]+y[k])/2;//记录线段中点
        
        bool flag = false;
        for(int i=1;i<=6;i++)
            for(int k=i+1;k<=6;k++)
                if(Line[i][0]==Line[k][0] && Line[i][1]==Line[k][1] && 
					(y[K[i][0]]-y[K[i][1]])*(x[K[k][0]]-x[K[k][1]]) != (y[K[k][0]]-y[K[k][1]])*(x[K[i][0]]-x[K[i][1]]))//中点相同,并且斜率不同
                    flag = true;
        
        if(flag) puts("YES");
        else puts("NO");
	}
	return 0;
}

//----------T2参考代码:-------------

#include <stdio.h>
#include <string.h>
int main(){
	int i,n,m,a,x,y,c,j;
	scanf("%d%d",&n,&m);
	char s[100000],temp,z[10000];
	getchar();			//get一个'\n' 否则后面的getchar()会出错 
	for(i=1;i<=n;i++)
		s[i]=getchar();
	while(m--){
		scanf("%d",&a);
		if(a==1){		//1. l, r 反转[l,r]区间的字符
    		scanf("%d%d",&x,&y);
    		c=(y-x)/2;
    		for(i=x;i<=x+c;i++){
        		temp=s[i];
        		s[i]=s[x+y-i];
        		s[x+y-i]=temp; 
    		}
		}
    	if(a==2){		//2. p, str 在第p个字符后插入字符串str
        	scanf("%d",&x);
        	getchar();
        	j=0;
        	z[j]=getchar();
        	while(z[j]!='\n'){
            	j++;
            	z[j]=getchar();
        	}
			for(i=n;i>=x+1;i--)
            	s[i+j]=s[i];
        	c=0;
        	for(i=x+1;i<=x+j;i++){
        		s[i]=z[c];
        		c++;
			}
        	n=n+j;  
    	}
    	if(a==3){		//3. l r 询问当前字符串子串s[l,r]是什么
    		scanf("%d%d",&x,&y);
    		for(i=x;i<=y;i++)
    			putchar(s[i]);
    		puts(s);
    	}
	}
	return 0;
}

//----------T3参考代码:-------------

#include <cstdio>
#include <cmath>
using namespace std;
int x[500], y[500];
double dis(int x1, int y1, int x2, int y2){
    return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
int main(){
    int n; scanf("%d",&n);
    long long res = 0;
    for (int i = 1; i <= n; i++) scanf("%d%d",&x[i],&y[i]);
    for (int i = 1; i <= n - 2; i++){
        for (int j = i + 1; j <= n - 1; j++){
            for (int k = j + 1; k <= n; k++){
                double l1 = dis(x[i], y[i], x[j], y[j]);
                double l2 = dis(x[i], y[i], x[k], y[k]);
                double l3 = dis(x[j], y[j], x[k], y[k]);
                if (l1 + l2 != l3 && l1 + l3 != l2 && l2 + l3 != l1){
                    if (l1 == l2 || l2 == l3 || l1 == l3){
                        if (l1 == l2){
                            if (l3 < l1 + l2) res++;
                        }else if (l1 == l3){
                            if (l2 < l1 + l3) res++;
                        }else if (l2 == l3){
                            if (l1 < l2 + l3) res++;
                        }
                    }
                }
            }
        }
    }
    printf("%lld",res);
}