算法竞赛入门码蹄集新手村600题(MT1551-1600)

Posted 灵彧universe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法竞赛入门码蹄集新手村600题(MT1551-1600)相关的知识,希望对你有一定的参考价值。

算法竞赛入门【码蹄集新手村600题】(MT1551-1600)


(文章目录)


前言



目录

1. MT1551 找字符串

(1)题目描述 有一个字符数组存有多个字符串(一个紧接一个) : i\\0love\\0my\\0mother\\0

编写函数找出每一个字符串,并返回到指针p所指向的指针数组中。

格式

样例1

(2)参考代码

#include <bits/stdc++.h>
using namespace std;
int find(char s[],int len, char *p[])
char* pos=s;
int cnt=0;
for (int i=0; i<len; i++)
	if (s[i]==\\0 && s[i-1]!=\\0) 
		p[cnt]=pos;
		cnt++;
		pos=s+i+1;
	

return cnt;

int main()
	char s[] = "1\\0love\\0my\\0mother\\0";
	int len = sizeof(s);
	char *p[100];
	int cnt=find(s, len, p);
	for (int i=0;i<cnt; i++)
		printf("%s\\n",p[i]);

return 0;


2. MT1552 指针数组

(1)题目描述 一个指针数组指向10个字符串常量,用选择排序法对指针数组按字符串排序。

格式

样例1

(2)参考代码

#include<bits/stdc++.h>
using namespace std;
int main() 
    char s[10][100];
    for (int i = 0; i < 10; i++)
	    cin.getline(s[i],100);
    char *sorted [10];
    for (int i = 0; i < 10; i++) sorted[i] = s[i];
    for (int i = 0; i < 10; i++)  
        int pos = i;
	    for (int j = i; j < 10; j++)
		    if (strcmp(sorted[pos], sorted[j]) > 0) pos = j;
	char *t = sorted [pos];
	sorted [pos] = sorted[i];
	sorted[i] = t;

for (int i=0; i<10;i++)
	printf("%s\\n", sorted[i]);
return 0;


3. MT1553 数组遍历

(1)题目描述 编写函数void Traverse(void*p,int n,void(*visit)(void *ep)),遍历p所指的数组的每个元素,通过调用函数void visit(void *ep);输出元素。那么设计不同的visit,使之能够实现char、double、int等类型的输出,则调用Traverse函数就可以支持多种类型的数组遍历。其中:

int a[]=1,2,3,4,5,6,7,8,9; double b[]=1.,2.,3.,4.,5.,6.,7.,8.,9.; char s[]=" abcdefghi”;

格式

样例1

(2)参考代码

#include <bits/stdc++.h>
using namespace std;

void visitint(void *p)
	printf("%d",*((int *) p));


void visitchar(void *p)
	printf("%c ", *((char *) p));


void visitdouble(void *p) 
	printf("%lf", * ((double *) p)) ;


void Traverse(void *p, int n, void(*visit) (void *ep)) 
	for(int i=0;i<n;i++)
        visit((char*) p + i * (visit == visitchar ? sizeof(char) : (visit ==visitint?sizeof(int):sizeof(double))));
    


int main() 
int a[]=1,2,3,4,5,6,7,8,9 ;
Traverse(a, 9, visitint);
printf("\\n");
double b[]=1.,2.,3.,4.,5.,6.,7.,8.,9.;
Traverse(b, 9, visitdouble);
printf("\\n");
char s[]="abcdefghi";
Traverse(s, 9, visitchar);
return 0;


4. MT1554 函数指针

(1)题目描述 输入两个整数,定义加法函数和减法函数,用指向函数的指针分别指向他们,通过指针调用函数求两数的和与差。

格式

样例1

(2)参考代码

#include <bits/stdc++.h>
int add(int a, int b) 
    return a+b;

int minus(int a, int b) 
    return a-b;


int main()
    int a, b;
    scanf ("%d%d", &a, &b) ;
    int (*p) (int a, int b);
    p=add;
    printf("%d ",p(a, b));
    p=minus;
    printf("%d ",p(a, b));


5. MT1555 返回指针

(1)题目描述 编写函数查找一维数组中的某个元素(仅查找第一次出现的即可),并返回该元素的指针(下标,从0开始),主调函数输出该元素的指针,如果没找到,则输出-1。

格式

样例1

(2)参考代码

#include <bits/stdc++.h>
using namespace std;

int getPointer(int a[], int n, int key)
	for (int i= 0; i < n; i++)
		if (key == a[i])
			return i;
	return -1;

int main() 
    int a [100], n;
    cin >> n;
    for (int i = 0; i < n; i++)
    cin >> a[i];
    int key;
    cin >> key;
    printf("%d", getPointer(a, n, key)) ;


6. MT1556 约瑟夫环1

(1)题目描述 约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。

格式

样例1

(2)参考代码

#include <bits/stdc++.h>
using namespace std;

typedef struct Node
int value;
Node *next;
 NODE, *PNODE,*NodeList;

PNODE createNode (int value, PNODE next)
	PNODE node = (PNODE) malloc(sizeof (NODE)) ;
	node->value = value;
	node->next = next;
	return node;

int main()
	int n, m;
	scanf("%d %d", &n, &m) ;
	NodeList head, last;

	for(int i=0; i<n; ++i) 
		PNODE node = createNode(i+1, NULL) ;
		if(i == 0)
		head = node;
		last = node;
 		else
			last->next = node;
			last = node;
		
		if(i==n-1)
			last->next=head;
		
		
	int i=1;
	while(head->next!=head)
		if(i==m)
			PNODE p=head;
			last->next=head->next;
            free(p);
            i=1;
            head=last->next;
		
		else
			last=head;
			head=head->next;
			i++;
		
	
	printf("%d",head->value);
	return 0;


7. MT1557 约瑟夫环2

(1)题目描述 约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求按顺序退出的人的序号序列。

格式

样例1

(2)参考代码

#include <bits/stdc++.h>
using namespace std;

typedef struct Node
	int value;
	Node *next;
 NODE, *PNODE,*NodeList;

PNODE createNode (int value, PNODE next)
	PNODE node = (PNODE) malloc(sizeof (NODE)) ;
	node->value = value;
	node->next = next;
	return node;

int main()
	int n, m;
	scanf("%d %d", &n, &m) ;
	NodeList head, last;

	for(int i=0; i<n; ++i) 
		PNODE node = createNode(i+1, NULL) ;
		if(i == 0)
		head = node;
		last = node;
 		else
			last->next = node;
			last = node;
		
		if(i==n-1)
			last->next=head;
		
		
	int i=1;
	while(head->next!=head)
		if(i==m)
			PNODE p=head;
			last->next=head->next;
			printf("%d ",head->value);
			free(p);
			i = 1;
			head = last->next;
		
		else
			last=head;
			head=head->next;
			i++;
		
	
	printf("%d ",head->value);
	return 0;


8. MT1558 新生命

(1)题目描述 狼群新生了一只尊贵的艾尔法狼,请设计一个结构体,管理它的信息,信息包括名字,年龄,性别。

输入艾尔法狼宝宝的信息,然后再输出他的信息。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct Wolf
    string name;
    int age;
    string sex;
w[1005];

int main( )

    cin>>w[0].name>>w[0].age>>w[0].sex;
    cout<<w[0].name<<" "<<w[0].age<<" "<<w[0].sex<<endl;
    return 0;


9. MT1559 幼儿园

(1)题目描述 幼儿园开学了,请帮老师设计一个结构体,管理宝宝们的信息,信息包括姓名,年龄,性别。

输入5个宝宝的信息,然后再输出他们的信息。

格式

样例1

(2)参考代码

#include <bits/stdc++.h>
using namespace std;
struct BABY 
char name[100];
int age;
char sex;
;

int main()

	BABY a[5];
	for(int i=0;i<5;i++)
		scanf("%s%d %c", a[i].name, &a[i].age, &a[i].sex);
	for (int i=0;i<5;i++)
		printf("%s %d %c ", a[i].name, a[i].age, a[i].sex);
	return 0;


10. MT1560 龙族

(1)题目描述 你在设计一个游戏,你负责龙族,请设计一个结构体,处理龙族生物的信息,信息包括品种,颜色,攻击力。

输入3个龙族生物的信息,然后再输出龙族生物的信息。

格式

样例1

(2)参考代码

#include <bits/stdc++.h>
using namespace std;

struct DRAGON 
	char race [20];
	char color[20];
	int power;
;
int main()

	struct DRAGON a[3];
	int i;
	for (i=0; i<3; i++)
		scanf("%s%s%d", a[i].race, a[i].color, &a[i].power) ;
	for(i=0; i<3; i++) 
		printf("%s %s %d", a[i].race, a[i].color, a[i].power);
		printf("\\n");

return 0;


11. MT1561 排兵布阵

(1)题目描述 你正在排兵布阵,请设计一个结构体,管理你的士兵,士兵信息包括兵种,武器,攻击力。

输入2种士兵的信息,然后再按照攻击力从大到小输出他们的信息。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct shibin
    char name[1005],tool[1005];
    int force;
shi[3];

int main( )

    for(int i=0;i<2;i++)
        cin>>shi[i].name>>shi[i].tool>>shi[i].force;
    

    if(shi[0].force>=shi[1].force)
        cout<<shi[0].name<<" "<<shi[0].tool<<" "<<shi[0].force<<endl;
        cout<<shi[1].name<<" "<<shi[1].tool<<" "<<shi[1].force;
    else
        cout<<shi[1].name<<" "<<shi[1].tool<<" "<<shi[1].force<<endl;
        cout<<shi[0].name<<" "<<shi[0].tool<<" "<<shi[0].force;
     
    return 0;


12. MT1562 谁是先锋

(1)题目描述 攻城战要开始了,女王依依手里有4个黑骑士,女王依依要找出最强大的黑骑士作为先锋。

请设计一个结构体,管理他们的信息,信息包括姓名,攻击力。

输入他们信息,然后再输出先锋的信息。

格式

样例1

备注:

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct shibin
    char name[1005];
    int force;
shi[5];

int main( )

    for(int i=0;i<4;i++)
        cin>>shi[i].name>>shi[i].force;
    
    int maxx=shi[0].force,index=0;
    for(int i=1;i<4;i++)
        if(shi[i].force>maxx)
            maxx=shi[i].force;
            index = i;
        
    
    cout<<shi[index].name<<" "<<shi[index].force<<endl;

    return 0;


13. MT1563 谁是胆小鬼

(1)题目描述 攻城战结束了,女王依依清点俘虏,发现跑掉了1个胆小的穴居人,女王依依要找出是谁跑掉了。斥候调查发现逃走的是一个攻击力最弱小的穴居人。

请设计一个结构体,管理穴居人俘虏的信息,信息包括姓名,攻击力。

输入4个俘虏的信息,然后再输出逃走的俘虏的信息。

格式

样例1

备注:

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct shibin
    char name[1005];
    int force;
shi[5];

int main( )

    for(int i=0;i<4;i++)
        cin>>shi[i].name>>shi[i].force;
    
    int minn=shi[0].force,index=0;
    for(int i=1;i<4;i++)
        if(shi[i].force<minn)
            minn=shi[i].force;
            index = i;
        
    
    cout<<shi[index].name<<" "<<shi[index].force<<endl;

    return 0;


14. MT1564 编程好难

(1)题目描述 小码哥买了3本编程书,他想先学最简单的,请帮他把最薄的书挑出来。请设计一个结构体,管理书籍的信息,信息包括种类,书名(不含空格),页数。输入书籍的信息,然后再输出最薄的书信息。

格式

样例1

备注:

(2)参考代码

#include<stdio.h>
struct Book 
    char typical[10];
    char book[50];
    int page;
;
struct Book bookneed[100];
int main()

    int i,j;
    for(i=1;i<=3;i++)
        scanf("%s",&bookneed[i].typical);
        scanf("%s",&bookneed[i].book);
        scanf("%d",&bookneed[i].page);
    
    for(i=1;i<=3;i++)
        for(j=1;j<=3-i;j++) 
            if (bookneed[j + 1].page < bookneed[j].page) 
                bookneed[0] = bookneed[j+1];
                bookneed[j + 1] = bookneed[j];
                bookneed[j] = bookneed[0];
            
        
    
    printf("%s %s %d",bookneed[1].typical,bookneed[1].book,bookneed[1].page);
    return 0;


15. MT1565 长者

(1)题目描述 输出结构体数组中年龄最大者的数据,请设计一个结构体,信息包括名字,年龄。输入5个人信息,然后再输出年龄最大的人的信息。

格式

样例1

备注:

(2)参考代码

#include<stdio.h>
struct AgeMan
    char name[50];
    int age;
;
struct AgeMan Minage[10];
int main()

    int n,j,i;
    for(n=1;n<=5;n++) scanf("%s %d",&Minage[n].name,&Minage[n].age);
    for(i=0; i<5; i++)
        for(j=0; j<5-i; j++)
            if(Minage[j+1].age>Minage[j].age)
                Minage[0] = Minage[j+1];
                Minage[j+1] = Minage[j];
                Minage[j] = Minage[0];
            
        
    
    
    printf("%s %d",Minage[0].name,Minage[0].age);
    return 0;


16. MT1566 幼者

(1)题目描述 输出结构体数组中年龄最小者的数据,请设计一个结构体,信息包括名字,年龄。输入5个人信息,然后再输出年龄最小的人的信息。

格式

样例1

备注:

(2)参考代码

#include<stdio.h>
struct AgeMan
    char name[50];
    int age;
;
struct AgeMan Minage[10];
int main()

    int n,j,i;
    for(n=1;n<=5;n++) scanf("%s %d",&Minage[n].name,&Minage[n].age);
    for(i=0; i<5; i++)
        for(j=0; j<5-i; j++)
            if(Minage[j+1].age<Minage[j].age)
                Minage[0] = Minage[j+1];
                Minage[j+1] = Minage[j];
                Minage[j] = Minage[0];
            
        
    
    
    printf("%s %d",Minage[0].name,Minage[0].age);
    return 0;


17. MT1567 员工薪水

(1)题目描述 有3个员工,从键盘输入数据,包括工号、姓名、薪水,工号薪水整型,姓名字符型,输出薪水最高的员工信息。不考虑非法输入等特殊情况。

格式

样例1

备注:

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;
struct yuangong
    int id,salary;
    string name;
y[4];

int main( )

    for(int i=0;i<3;i++)
       cin>>y[i].id>>y[i].name>>y[i].salary;
    
    
    int index=0,maxx=y[0].salary;
    for(int i=1;i<3;i++)
        if(maxx<y[i].salary)
            maxx = y[i].salary;
            index = i;
        
    

    cout<<y[index].id<<" "<<y[index].name<<" "<<maxx<<endl;
    return 0;


18. MT1568 学生成绩

(1)题目描述 有3个学生,每个学生有3门课的成绩,从键盘输入数据,包括学号、姓名、三门课成绩,学号整型,姓名字符型,成绩实型,计算3门课程总平均成绩,以及平均分最高的学生信息。不考虑非法成绩等特殊情况。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;
struct student
    int id;
    double source1,source2,source3;
    string name;
s[1005];

int main( )

    double sum[105];
    for(int i=0;i<3;i++)
       cin>>s[i].id>>s[i].name>>s[i].source1>>s[i].source2>>s[i].source3;
       sum[i]=s[i].source1+s[i].source2+s[i].source3;
    
    
    int index=0;
    double maxx=sum[0];
    for(int i=1;i<3;i++)
        if(maxx<sum[i])
            maxx = sum[i];
            index = i;
        
    

    cout<<s[index].id<<" "<<s[index].name<<" "<<s[index].source1<<" "<<s[index].source2<<" "<<s[index].source3;
    return 0;


19. MT1569 小码哥学编程

(1)题目描述 小码哥买了3本编程书,他想先学习C语音,请帮他把C相关的书挑出来。请设计一个结构体,管理书籍的信息,信息包括种类,书名(不含空格),价格。输入书籍的信息,然后再输出所有的C相关的书信息。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct book
    string name,kind;
    int price;
b[1005];

int main( )

    for(int i=0;i<3;i++) cin>>b[i].kind>>b[i].name>>b[i].price;
    for(int i=0;i<3;i++)
        if(b[i].kind=="c")
            cout<<b[i].kind<<" "<<b[i].name<<" "<<b[i].price<<endl;
        
    
    return 0;


20. MT1570 感冒来袭

(1)题目描述 冬天到了,社区居民被流感侵袭,校医院组织大家打疫苗,一共应该打3针才结束。社区有3个居民,从键盘输入数据,包括姓名、年龄、疫苗打了几针,年龄、疫苗整型,姓名字符型,输出所有还没打够针的人信息。不考虑非法输入等特殊情况。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct cun
    string name;
    int num,age;
c[1005];

int main( )

    for(int i=0;i<3;i++) cin>>c[i].name>>c[i].age>>c[i].num;
    for(int i=0;i<3;i++)
        if(c[i].num<3)
            cout<<c[i].name<<" "<<c[i].age<<" "<<c[i].num<<endl;
        
    
    return 0;


21. MT1571 贫困补助

(1)题目描述 有3个贫困学生,按家庭年收入发放贫困补助,从键盘输入数据,包括学号、姓名、家庭年收入,学号年收入整型,姓名字符型,年收入低于1万的发5000,低于2万的发3000,低于3万发1000,其他不发。

输出所有人信息及补助。

不考虑非法输入等特殊情况。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct STUDENT
    int number;
    char name[20];
    int income;
;

int main( )

    STUDENT stu;
    int subsidy;
    for(int j=0;j<3;j++)
        scanf("%d %s %d",&(stu.number),stu.name,&(stu.income));

        if(stu.income<10000) subsidy=5000;
        else if(stu.income<20000) subsidy=3000;
        else if(stu.income<30000) subsidy=1000;
        else subsidy=0;
        printf("%d %s %d %d\\n",stu.number,stu.name,stu.income,subsidy);
    
    return 0;


22. MT1572 交网费

(1)题目描述

小码哥又喜欢看电视又喜欢打电话聊天,每个月都要花掉很多网费。从键盘输入数据,包括第几季度、该季度网费、话费,其全部整型,计算小码哥今年花了多少钱。不考虑非法输入等特殊情况。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct Cost
    int quarter;
    int netFee;
    int telFee;
cost[4];

int main( )

    int ans=0;
    for(int i=0;i<4;i++)
        cin>>cost[i].quarter>>cost[i].netFee>>cost[i].telFee;
    
    for(int i=0;i<4;i++)
        ans+=cost[i].netFee;
        ans+=cost[i].telFee;
    
    cout<<ans<<endl;
    return 0;


23. MT1573 囤白菜

(1)题目描述 疫情期间,社区居民纷纷前往超市囤积食品,小码哥买了白菜、萝卜和豆腐,从键盘输入数据,包括菜名、重量(斤)、单价(元),其中重量、单价实型,菜名字符型,计算小码哥囤菜一共花了多少钱。不考虑非法输入等特殊情况。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct Vegetable
    char foodName[1005];
    double wight,danjia;
Vegetable[3];

int main( )

    double res;
    for(int i=0;i<3;i++)
        cin>>Vegetable[i].foodName>>Vegetable[i].wight>>Vegetable[i].danjia;
    
    for(int i=0;i<3;i++)
        res+=Vegetable[i].wight * Vegetable[i].danjia;
    
    cout<<fixed<<setprecision(6)<<res<<endl;
    return 0;


24. MT1574 花友

(1)题目描述 小码哥是个花友,整天沉迷于网上购买花卉,每个月都要花掉很多费用,今年又买了4种花,从键盘输入数据,包括花名、数量、单价,其中花名字符型,其他其全部整型,计算小码哥今年花了多少钱。不考虑非法输入等特殊情况。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct huarui
    char name[1005];
    int num,price;
huarui[4];

int main( )

    int ans=0;
    for(int i=0;i<4;i++)
        cin>>huarui[i].name>>huarui[i].num>>huarui[i].price;
    
    for(int i=0;i<4;i++)
        ans+=huarui[i].num*huarui[i].price;
    
    cout<<ans<<endl;
    return 0;


25. MT1575 遛狗

(1)题目描述 小码哥减肥很多年了,屡战屡败,依然贼心不死,天天计算食物的卡路里。今天他又没管住嘴,大吃了一顿,只好吃完出门遛狗。从键盘输入数据,包括3种食物名、卡路里,其中食物名字符型,卡路里整型。

假定小区遛狗1圈消耗50卡路里,计算小码哥今天需要遛狗多少圈。

不考虑非法输入等特殊情况。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct Food
    char name[1005];
    int calorie;
food[3];

int main( )

    double ans;
    for(int i=0;i<3;i++)
        cin>>food[i].name>>food[i].calorie;
    
    for(int i=0;i<3;i++)
        ans+=food[i].calorie;
    
    double res = ans*1.0/50;
    cout<<fixed<<setprecision(6)<<res<<endl;
    return 0;


26. MT1576 减肥大计

(1)题目描述 小码哥酷爱减肥,他减肥的另一种方式是散步。目测他腹部,臀部,手臂,大腿脂肪比较多,从键盘输入这四种部位和脂肪含量,其中身体部位字符型,脂肪含量整型。

假定散步1天减掉0.05公斤脂肪,计算小码哥需要散步多少天。

不考虑非法输入等特殊情况。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct body
    char name[50];
    int cal;
body[4];

int main( )

    int ans;
    for(int i=0;i<4;i++)
        cin>>body[i].name>>body[i].cal;
    
    for(int i=0;i<4;i++)
        ans+=body[i].cal;
    
    double res = ans*1.0/0.05;
    cout<<fixed<<setprecision(6)<<res<<endl;
    return 0;


27. MT1577 赡养老人

(1)题目描述 小码哥的爷爷奶奶年纪大了,小码哥的父母每个季度初都会给爷爷奶奶家用。′小码哥的爷爷奶奶每个月会从手里剩下的钱里花掉3000元(如果钱不够3000,则将手里的钱花完再想别的办法)。年底如果盈余就会把盈余包成红包送给小码哥当作压岁钱,没有盈余就没有红包压岁钱。

从键盘输入数据,包括第几个季度、汇款,都是整型。计算今年小码哥的压岁钱有多少钱。

不考虑非法输入等特殊情况。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct Money
    int quarter;
    int pay;
money[3];

int main( )

    for(int i=0;i<4;i++) cin>>money[i].quarter>>money[i].pay;
    int temp=0;
    for(int i=0;i<4;i++)
        temp+=money[i].pay-3000*3;
        if(temp<0) temp=0;
    
    cout<<temp<<endl;
    return 0;


28. MT1578 复数

(1)题目描述 用下面的结构体类型表示复数:

struct COMPLEX double r, i;;其中实部r、虚部i。

编写四个函数分别实现复数的和、差、积、商计算,在主函数中输入数据并调用这些函数得到复数运算结果。

格式

样例1

备注:

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct COMPLEX
    double r,i;

    COMPLEX operator+(const COMPLEX &a)
        COMPLEX rtn;
        rtn.r = this->r+a.r;
        rtn.i = this->i+a.i;
        return rtn;
    

    COMPLEX operator-(const COMPLEX &a)
        COMPLEX rtn;
        rtn.r = this->r-a.r;
        rtn.i = this->i-a.i;
        return rtn;
    

    COMPLEX operator*(const COMPLEX &a)
        COMPLEX rtn;
        rtn.r = this->r*a.r-this->i*a.i;
        rtn.i = this->r*a.i+ this->i*a.r;
        return rtn;
    

    COMPLEX operator/(const COMPLEX &a)
        COMPLEX rtn;
        rtn.r = (this->r*a.r+this->i*a.i)/(a.r*a.r+a.i*a.i);
        rtn.i = (this->i*a.r-this->r*a.i)/(a.r*a.r+a.i*a.i);
        return rtn;
    

;

int main( )

    COMPLEX a,b,c;
    scanf("%lf %lf %lf %lf",&a.r,&a.i,&b.r,&b.i);

    c = a+b;
    if(c.i>0) printf("%.3lf+%.3lfi\\n",c.r,c.i);
    else if(c.i<0) printf("%.3lf%.3lfi\\n",c.r,c.i);

    c = a-b;
    if(c.i>0) printf("%.3lf+%.3lfi\\n",c.r,c.i);
    else if(c.i<0) printf("%.3lf%.3lfi\\n",c.r,c.i);

    c = a*b;
    if(c.i>0) printf("%.3lf+%.3lfi\\n",c.r,c.i);
    else if(c.i<0) printf("%.3lf%.3lfi\\n",c.r,c.i);

     c = a/b;
    if(c.i>0) printf("%.3lf+%.3lfi\\n",c.r,c.i);
    else if(c.i<0) printf("%.3lf%.3lfi\\n",c.r,c.i);

    return 0;


29. MT1579 线段与线段的关系

(1)题目描述 设计分数类型:

struct FRACTION int fenzi, fm;

fenzi是分子femu是分母,编写四个函数分别实现分数的和、差、积、商计算,在主函数中输入4个正整数,分别表示两个分数的分子分母,然后调用这些函数得到分数运算结果。

格式

样例1

备注:

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct Fraction
    int fenzi,fm
fraction[2];

int gcd(int x,int y)
    return (!y)?x:gcd(y,x%y);


void myPrint(int zi,int mu)
    bool isPositive = true;
    if((zi*mu)<0) isPositive = false;
    zi = abs(zi);
    mu = abs(mu);
    if(mu==1)
        if(isPositive) printf("%d\\n",zi);
        else printf("-%d\\n",zi);
    else
        if(isPositive) printf("%d/%d\\n",zi,mu);
        else printf("-%d/%d\\n",zi,mu);
    


int main( )

    int zi=0,mu=0;

    for(int i=0;i<2;i++)
        cin>>fraction[i].fenzi>>fraction[i].fm
    

    // 加
    zi = fraction[0].fenzi*fraction[1].femu+fraction[1].fenzi*fraction[0].fm
    mu = fraction[0].femu*fraction[1].fm
    int temp = gcd(zi,mu);
    zi /= temp;
    mu /= temp;
    myPrint(zi, mu);

    //减
    zi = fraction[0].fenzi*fraction[1].fenmu-fraction[1].fenzi*fraction[0].fnmu
    mu = fraction[0].fenmu*fraction[1].fnmu
    temp = gcd(zi,mu);
    zi /= temp;
    mu /= temp;
    myPrint(zi, mu);

    //乘
    zi = fraction[0].fenzi*fraction[1].fenzi;
    mu = fraction[0].fenmu*fraction[1].fnmu
    temp = gcd(zi,mu);
    zi /= temp;
    mu /= temp;
    myPrint(zi, mu);

    //除
    zi = fraction[0].fenzi*fraction[1].fnmu
    mu = fraction[0].fenmu*fraction[1].fenzi;
    temp = gcd(zi,mu);
    zi /= temp;
    mu /= temp;
    myPrint(zi, mu);
    return 0;


30. MT1580 补考

(1)题目描述 设有一个学校人员信息表,其中学生信息包括姓名、号码、性别、班级和成绩,成绩整型,其他字符型,输入人员数据,统计学生不及格的人数。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct Student
    char name[20];
    char tel[15];
    char sex[5];
    char classID[20];
    int grade;
stduent[1005];

int main( )

    int n,cnt=0;
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>stduent[i].name>>stduent[i].tel>>stduent[i].sex>>stduent[i].classID>>stduent[i].grade;
    
    for(int i=0;i<n;i++)
        if(stduent[i].grade<60) cnt++;
    
    cout<<cnt<<endl;
    return 0;



31. MT1581 讲师

(1)题目描述 设有一个学校人员信息表,其中教师信息包括姓名、号码、性别、职称和工资,工资整型,其他字符型,输入人员数据,统计职称为讲师的人数。

格式

样例1

(2)参考代码

import java.util.Scanner;
import java.util.*;

class Main 

   public static void main(String[] args) 

      Scanner sc = new Scanner(System.in);
      int n = sc.nextInt();
      int count=0;
      for(int i=0;i<n;i++)
         String name = sc.next();
         String tel = sc.next();
         String sex = sc.next();
         String level = sc.next().toLowerCase();
         int salary = sc.nextInt();
         if(level.contains("jiangshi")) count++;
      
      System.out.println(count);
      sc.close();
   


32. MT1582 星期几

(1)题目描述 设计日期类型如下: struct DATE int month, day;;

已知1月1日是星期五(假设该年是非闰年),计算输入的日期为星期几。用整数1、2、3等等分别代表周一、周二、周三等等。

格式

样例1

备注:

(2)参考代码

#include<bits/stdc++.h> 
using namespace std;

struct DATE
int month,day;
;

int main( )
DATE date;
    int tempday,MOD;
    cin >> date.month >> date.day;
int a[]=0,31,59,90,120,151,181,212,243,273,304,334,365;
tempday=a[date.month-1]+date.day+5;
MOD = tempday%7;
MOD = MOD+6;
if(MOD>7) MOD = MOD%7;
printf("%d",MOD);
    return 0;


33. MT1583 日期

(1)题目描述 设计日期类型如下: struct DATE int month, day;;

假设某一年是非闰年。编写函数计算输入的日期加减n天(正为后,负为前)的日期。不考虑超出该年的情况。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct DATE
    int month,day;
;

int DATEtoDAY(DATE date)
    int count=0;
    int m[]=0,31,28,31,30,31,30,31,31,30,31,30,31;
    for(int i=1;i<=date.month;i++)
        count += m[i-1];
    count += date.day;
    return count;


DATE DAYtoDATE(int count)
    DATE date;
    int m[]=0,31,28,31,30,31,30,31,31,30,31,30,31;
    int i=1;
    while(count>m[i])
        count -= m[i];
        i++;
    
    date.month = i;
    date.day = count;
    return date;


int main( )

    DATE date;
    scanf("%d %d",&date.month,&date.day);
    int n;
    scanf("%d",&n);
    int count=DATEtoDAY(date);
    count += n;
    date = DAYtoDATE(count);
    printf("%d %d",date.month,date.day);
    return 0;


34. MT1584 日期差

(1)题目描述 设计日期类型如下: struct DATE int month, day;;

假设某一年是非闰年。输入该年内的两组日期,计算两个日期间的差((天数)。统一用后输入的日期减去先输入的日期。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct DATE
    int month,day;
;

int DATEtoDAY(DATE date)
    int count=0;
    int m[]=0,31,28,31,30,31,30,31,31,30,31,30,31;
    for(int i=1;i<=date.month;i++)
        count += m[i-1];
    count += date.day;
    return count;


DATE DAYtoDATE(int count)
    DATE date;
    int m[]=0,31,28,31,30,31,30,31,31,30,31,30,31;
    int i=1;
    while(count>m[i])
        count -= m[i];
        i++;
    
    date.month = i;
    date.day = count;
    return date;


int main( )

    DATE date1,date2;
    scanf("%d %d",&date1.month,&date1.day);
    scanf("%d %d",&date2.month,&date2.day);
    int n=DATEtoDAY(date2)-DATEtoDAY(date1);
    printf("%d",n);
    return 0;


35. MT1585 两点距离

(1)题目描述 用下面的数据类型分别表示点: struct POINT int x, y; ;

输入两个点的坐标值x和y,编写函数求两点距离。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct Point
    int x,y;
point[2];

int main( )

    for(int i=0;i<2;i++)
        cin>>point[i].x>>point[i].y;
    
    double dist=0;
    dist = sqrt(pow(point[0].x-point[1].x,2.0)+pow(point[0].y-point[1].y,2.0));
    cout<<fixed<<setprecision(2)<<dist<<endl;
    return 0;


36. MT1586 矩形面积

(1)题目描述 用下面的数据类型分别表示点和矩形:struct POINT//点 int x, y;//坐标值x和y ; struct RECT//矩形 POINT It, rb;//矩形的左上角和右下角 ; 有一个矩形,矩形的边分别和x,y轴平行,输入矩形两个点的坐标值x和y,编写函数求矩形面积。不考虑溢出之类的特殊情况。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct Point
    int x,y;
point[2];

struct Rect
    Point lt,rb;
rect;

int main( )

    int ans;
    for(int i=0;i<2;i++)
        cin>>point[i].x>>point[i].y;
    
    rect.lt = point[0],rect.rb = point[1];
    int length =0,width=0;
    length = abs(rect.lt.x-rect.rb.x);
    width = abs(rect.lt.y-rect.rb.y);
    ans=length*width;
    cout<<ans<<endl;
    return 0;


37. MT1587 圆面积

(1)题目描述 用下面的数据类型分别表示点和圆: struct POINT //点 int x, y;//坐标值x和y ; struct CIRCLE//圆 POINT C;//圆心 double r;//半径 ; 依次输入圆心的坐标值x、y和半径,编写函数求圆面积。

格式

样例1

备注:

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;
double res,PI=3.1415926;
struct Point
    int x,y;
point;

struct Rect
    Point c;
    double r;
rect;

int main( )

    cin >> point.x >> point.y >>rect.r;
    rect.c = point;
    res = PI*rect.r*rect.r;
    cout<<fixed<<setprecision(2)<<res<<endl;
    return 0;


38. MT1588 最大的长方体

(1)题目描述 输入n (n<10000)个长方体的长l,宽w,高h,求其表面积最大的立方体。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;
typedef long long ll;
struct Cuboid
    int l,w,h;
cuboid[1005];

int main( )

    ll n;
    int index=0,maxx=0;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>cuboid[i].l>>cuboid[i].w>>cuboid[i].h;
    
    for(int i=1;i<=n;i++)
        ll temp=0;
        temp=(cuboid[i].l*cuboid[i].w+cuboid[i].l*cuboid[i].h+cuboid[i].h*cuboid[i].w)*2;
        if(temp>maxx)
            maxx = temp;
            index = i;
        
    
    cout<<index<<endl;
    return 0;


39. MT1589 园的边框

(1)题目描述 用下面的数据类型分别表示点和圆: struct POINT //点 int x, y;//坐标值x和y ; struct CIRCLE //圆 POINT C;//圆心 double r;//半径 ; 依次输入圆心的坐标值x、 y和半径,再在第二行输入第2个点的坐标,判断第2个点是否在圆的边框上。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct Point
    int x,y;
point[2];

struct Rect
    Point c;
    double r;
rect;

int main( )

    cin>>point[0].x>>point[0].y>>rect.r;
    cin>>point[1].x>>point[1].y;
    rect.c = point[0];
    double dist=0;
    dist = sqrt(pow(point[0].x-point[1].x,2.0)+pow(point[0].y-point[1].y,2.0));
    if(abs(dist-rect.r)<0.000001) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    return 0;


40. MT1590 矩形的边框

(1)题目描述 用下面的数据类型分别表示点和矩形: struct POINT//点 int x, y;//坐标值x和y ; struct RECT //矩形 POINT It, rb;//矩形的左上角和右下角 ; 输入矩形两个点的坐标值x和y,再输入第3个点的坐标,判断第3个点是否在矩形的边框上。

格式

样例1

备注:

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct Point
    int x,y;
point[5];

struct Rect
    Point lt,rb;
rect;

int main( )

    bool flag=false;
    for(int i=1;i<=3;i++) cin>>point[i].x>>point[i].y;
    rect.lt = point[1];
    rect.rb = point[2];
    if(point[3].x==rect.lt.x || point[3].x == rect.rb.x)
        if(point[3].y >= rect.rb.y && point[3].y <=rect.lt.y) 
            flag=true;
    

    if(point[3].y == rect.lt.y || point[3].y == rect.rb.y)
        if(point[3].x >= rect.lt.x && point[3].x <= rect.rb.x)
            flag=true;
    

    if(flag) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    return 0;


41. MT1591 圆的内部

(1)题目描述 用下面的数据类型分别表示点和圆: struct POINT//点 int x, y;l/坐标值x和y ; struct CIRCLE//圆 POINT c;//圆心 double r;l/半径 ; 输入圆心的坐标值xy和半径,再在第二行输入第2个点的坐标,判断第2个点是否在圆的内部上。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

struct Point
    int x,y;
point[2];

struct Rect
    Point c;
    double r;
rect;

int main( )

    cin>>point[0].x>>point[0].y>>rect.r;
    cin>>point[1].x>>point[1].y;
    rect.c = point[0];
    double dist=0;
    dist = sqrt(pow(point[0].x-point[1].x,2.0)+pow(point[0].y-point[1].y,2.0));
    if(rect.r-dist>0) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    return 0;


42. MT1592 矩形的内部

(1)题目描述 用下面的数据类型分别表示点和矩形: struct POINT //点 int x, y;//坐标值x和y ; struct RECT//矩形 POINT It, rb;//矩形的左上角和右下角 ; 输入矩形两个点的坐标值x和y,再输入第3个点的坐标,判断第3个点是否在矩形的内部((不含边框)。

格式

样例1

备注:

(2)参考代码

#include<bits/stdc++.h>
using namespace std;

struct POINT
    int x,y;
;

struct RECT
    POINT lt,rb;
;
int main()
    RECT rect;
    POINT point;
    scanf("%d %d", &(rect.lt.x), &(rect.lt.y));
    scanf("%d %d", &(rect.rb.x), &(rect.rb.y));
    scanf("%d %d", &(point.x), &(point.y));

    if((point.x > rect.lt.x && point.x<rect.rb.x)&&(point.y > rect.rb.y && point.y < rect.lt.y))
        printf("YES\\n");
    else printf("NO\\n");
return 0;



43. MT1593 点到线

(1)题目描述 用下面的数据类型分别表示点和线: struct POINT//点 int x, y;//坐标值x和y ; struct LINE//线 POINT s, e;//线的两端 ; 输入线段两个端点的坐标值x和y,再输入第3个点的坐标,计算第3个点距这条线的最近距离。

格式

样例1

备注: 此题求的是点到直线最短距离

(2)参考代码

#include<bits/stdc++.h>
using namespace std;
struct POINT //点
    int x,y; //坐标值×和y
;
struct LINE //线
    POINT s,e; //线的两端
;
int main()

    POINT p;
    LINE line;
    double s,d,h;
    scanf("%d%d", &line.s.x, &line.s.y);
    scanf("%d%d", &line.e.x, &line.e.y);
    scanf("%d%d", &p.x, &p.y);
    s=fabs(line.s.x*(line.e.y-p.y)+line.e.x*(p.y-line.s.y)+p.x*(line.s.y-line.e.y))/2;
    d=sqrt((line.e.x-line.s.x)*(line.e.x-line.s.x)+(line.e.y-line.s.y)*(line.e.y-line.s.y));
    h=s*2/d;
    printf("%.2lf\\n",h);
    return 0;


44. MT1594 点到圆

(1)题目描述 用下面的数据类型分别表示点和圆: struct POINT//点 int x, y;//坐标值x和y ; struct CIRCLE//圆 POINT c;//圆心 double r;//半径 ; 依次输入圆心的坐标值x、y和半径,再在第二行输入第2个点的坐标,计算第2个点距这个圆的最近距离。如果点在圆内部或者边框上,距离计为0。

格式

样例1

样例2

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;

double res;

struct Point
    int x,y;
point[2];

struct Circle
    Point c;
    double r;
circle;

int main( )

    cin>>point[0].x>>point[0].y>>circle.r;
    cin>>point[1].x>>point[1].y;
    circle.c = point[0];
    double dist = 0;
    dist = sqrt(pow(point[1].x - circle.c.x,2.0)+pow(point[1].y-circle.c.y,2.0));
    if(dist - circle.r<=0) cout<<0<<endl;
    else
        res = dist-circle.r;
        cout<<fixed<<setprecision(2)<<res<<endl;
    
    return 0;


45. MT1595 点到矩形

(1)题目描述 用下面的数据类型分别表示点和矩形: struct POINT //点 int x, y;/I坐标值x和y ; struct RECT//矩形 POINT lt, rb;//矩形的左上角和右下角 ; 输入矩形两个点的坐标值x和y,再输入第3个点的坐标,计算第3个点距这个矩形的最近距离。如果点在矩形内部或者边框上,距离计为0。

格式

样例1

样例2

备注:

(2)参考代码

#include<bits/stdc++.h>
using namespace std;
struct POINT //点
    int x,y; //坐标值×和y
;
struct LINE //线
    POINT s,e; //线的两端
;
struct RECT //矩形
    POINT lt,rb; //矩形的左上角和右下角
;
double pointToPoint(POINT a,POINT b)
    double d =sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); return d;
return d;

double pointToLine(POINT p,LINE l)
    double s=fabs(l.s.x*(l.e.y-p.y)+l.e.x*(p.y-l.s.y)+p.x*(l.s.y-l.e.y))/2;
    double d=pointToPoint(l.s,l.e);
    double h=s*2/d;
    return h;

int main()

    POINT plt,plb,prt,prb,point;
    LINE lineLeft,lineRight,lineTop,lineBottom;
    RECT rect;
    scanf("%d %d",&plt.x,&plt.y);
    scanf("%d %d",&prb.x,&prb.y);
    scanf("%d %d",&point.x,&point.y);
    plb.x=plt.x,plb.y=prb.y;
    prt.x=prb.x,prt.y=plt.y;
    lineLeft.e=plb,lineLeft.s=plt;
    lineRight.e=prb,lineRight.s=prt;
    lineBottom.e=plb,lineBottom.s=prb;
    lineTop.e=plt,lineTop.s=prt;
    rect.lt=plt,rect.rb=prb;
    if(plt.x<=point.x&point.x<=prt.x&plb.y<=point.y&&point.y<=plt.y)
        printf("0");

    else
        //矩形×范围内上方或下方
        if(plt.x<=point.x&point.x<=prt.x)
            double d1=pointToLine(point,lineTop);double d2=pointToLine(point,lineBottom);printf("%lf",min(d1,d2));
            return 0;
        
        //矩形y范围内左侧或右侧
        if(plb.y<=point.y&&point.y<=plt.y)
            double d1=pointToLine(point,lineLeft);
            double d2=pointToLine(point,lineRight);
            printf("%lf",min(d1,d2));
            return 0;
        

        //其他情况,取最近的顶点距离作为距离
    double d1=pointToPoint(point,plt);
    double d2=pointToPoint(point,plb);
    double d3=pointToPoint(point,prt);
    double d4=pointToPoint(point,prb);
    printf("%lf",min(min(d1,d2),min(d3,d4)));
    return 0;
    



46. MT1596 线到矩形

(1)题目描述 用下面的数据类型分别表示点、线和矩形: struct POINT //点n的阶乘 int x, y;l/坐标值x和y ; struct LINE//线P OINT s, e;//线的两端 ; struct RECT //矩形 POINT It, rb;//矩形的左上角和右下角 ; 输入矩形两个点的坐标值,再输入线段的端点的坐标值,判断线段是否会与矩形面相交,输出YES或者NO。

线段与矩形面相交的定义:只要线段上有一点在矩形框上或者框内,则认为该线段与矩形面相交。

格式

样例1

(2)参考代码

#include<bits/stdc++.h>
using namespace std;
struct POINT
int x,y;
;
    struct LINE
    POINT s,e;
;
struct RECT
    POINT lt,rb;
;
bool intersect(LINE AB,LINE CD)//判断线段CD是否与直线AB相交
//直线AB的直线方程为:
// f(x,y)=(y-A.y)*(A.x-B.x)-(x-A.x)*(A.y-B.y)=0
    POINT A=AB.e,B=AB.s;
    POINT C=CD.e,D=CD.s;
    int fc=(C.y-A.y)*(A.x-B.x)-(C.x-A.x)*(A.y-B.y);
    int fd=(D.y-A.y)*(A.x-B.x)-(D.x-A.x)*(A.y-B.y);
    if(fc*fd<=0) return true;
    else return false;

//判断两线段是否相交
bool interSegment(LINE AB,LINE CD)
    if(intersect(AB, CD) && intersect(CD, AB)) return true;
    else return false;


bool inRect(POINT point,RECT rect)
    if(point.x<=rect.rb.x&point.x>=rect.lt.x&&point.y<=rect.lt.y&&point.x>=rect.rb.y)return true;
    else return false;


int main ()
    int x1,y1,x2,y2,x3,y3,x4,y4; cin >>x1>>y1>>x2>>y2;
    cin >>x3>>y3>>x4>>y4;
    POINT LT x1,y1, LB x1,y2, RT x2,y1, RB x2,y2, lineA x3,y3,lineBx4,y4;
    RECT rect  LT , RB ;
    LINE diag1 LT , RB ,diag2 LB , RT , lineAB  lineA , lineB ;
    bool flag = false ;
    if ( inRect ( lineA , rect )|| inRect(lineB, rect ))
        flag = true ;
    if ( interSegment ( lineAB ,diag1) || interSegment ( lineAB ,diag2))
        flag = true ;
    if ( flag )  cout <<"YES ";
    else  cout <<"NO";
    return 0;
 


47. MT1597 平行线

(1)题目描述 用下面的数据类型表示线:

struct POINT //点 int x, y;/l坐标值x和y ;

struct LINE//线 POINT s, e;//线的两端 ;

输入2个线段的端点的坐标值x和y,判断两条线段所在直线是否为平行线。如果两线段共线,判为不平行。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 

using namespace std;
struct POINT
	int x,y;
;
struct LINE
	POINT s,e;
;

bool parallel (LINE AB,LINE CD)
	POINT A =AB.e,B = AB.s;
	POINT C =CD.e,D = CD.s;
	if(A.x==B.x||C.x==D.x||A.y==B.y||C.y==D.y)
		if(A.x==B.x&&C.x==D.x||A.y==B.y&&C.y==D.y)
			return true;
	if((B.y-A.y) * (D.x - C.x )==(D.y-C.y)*(B.x-A.x))
		return true;
	return false;

int main( )
	POINT A,B,C,D;
	cin>>A.x>>A.y>>B.x>>B.y>>C.x>>C.y>>D.x>>D.y; 
	bool flag =false;
	if(parallel(LINEA,B,LINEC,D))
		flag =true;
	if(parallel(LINEA,C,LINEC,D))
		flag =false;
	if(flag)
		cout <<"YES";
	else cout <<"NO";
    return 0;


48. MT1598 交叉线

(1)题目描述 用下面的数据类型表示线: struct POINT //点 int x, y;l/坐标值x和y ; struct LINE//线 POINT s, e;//线的两端 ; 输入2个线段的端点的坐标值x和y,判断两条线段是否交叉、求交叉点位置。如果不交叉或者重叠则输出-1。

格式

样例1

(2)参考代码

#include <bits/stdc++.h>
using namespace std;

struct POINT 
	int x, y;
;
struct LINE 
	POINT s, e;
;
struct EQUATION//直线斜截式方程:y=ax+b
	LINE line;
	double a;
	double b;
	bool vertical;//是否垂直,即斜率不存在
;

EQUATION get_equa(LINE line)
	EQUATION equation;
	equation.line = line;
	if (line.e.x == line.s.x)
		equation.vertical = true;
	else 
		equation.a =(line.s.y - line.e.y)* 1.0 / (line.s.x - line.e.x);
		equation.b = line.s.y - equation.a* line.s.x;
		equation.vertical = false;
	
return equation;


//判断线的交点是不是在线段两个端点区域内
bool judge_point(LINE l1,LINE l2,double x, double y)
	if((x-l1.s.x)* (x-l1.e.x)<= 0 && (y-l1.s.y) *(y-l1.e.y)<= 0
	&&(x-l2.s.x)* (x-l2.e.x) <= 0 &&(y-l2.s.y) *(y-l2.e.y)<= 0)
		return true;
	else
		return false;


//计算交点:存在一个斜率不存在的时候
void vertTrue(EQUATION vert,EQUATION normal)
double x = vert.line.e.x;
double y = normal.a*x +normal.b;
if (judge_point(vert.line,normal.line,x,y))
	printf( "%.2lf %.2lf\\n",x,y);
else
	printf("-1\\n");


//斜率都存在的时候
void vertFalse(EQUATION normal1,EQUATION normal2)
double diff_a = normal1.a - normal2.a;
if(diff_a ==0)
printf("-1\\n");else 
double x =-(normal1.b - normal2.b)/(normal1.a - normal2.a);double y = normal1.a*x +normal1.b;
if(judge_point(normal1.line,normal2.line,x,y))
	printf("%.2lf %.2lf\\n", x,y);
else
	printf("-1\\n");
	


int main()
LINE l1,l2;
scanf("%d%d%d%d",&l1.s.x,&l1.s.y,&l1.e.x,&l1.e.y);
scanf("%d%d%d%d",&l2.s.x,&l2.s.y,&l2.e.x,&l2.e.y);
EQUATION line1 = get_equa(l1);
EQUATION line2 = get_equa(l2);
if (line1.vertical && !line2. vertical)
vertTrue(line1,line2);
else if(!line1.vertical && line2.vertical)
vertTrue(line2,line1);
else if(line1.vertical && line2.vertical)
printf("-1\\n");
else
	vertFalse(line1,line2);
return 0;


49. MT1599 成绩排名

(1)题目描述 输入n个学生的名字以及其学习成绩,求学习成绩成绩从高到低排序的名单。如果成绩相同,则按字典序降序排序。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 
using namespace std;
typedef long long ll ;
#define MAX_NUM 10010
#define PI 3.1415926
double res;
int ans, n, m, k,len,cnt = 0,minn = MAX_NUM, maxx = 0;
char ch, s1[MAX_NUM] = "", s2[MAX_NUM] = "";
bool flag = false;
int a[MAX_NUM]= 0,b[MAX_NUM]= 0;
double x,s,t;

struct Student
string name;
int grade;
student[ MAX_NUM];

bool cmp(Student s1,Student s2)  //cmp true不用交换位置false需要交换位置
if( s1.grade != s2.grade) 
	if(s1.grade > s2.grade)
		return true;
	else
		return false;
else 
	if(s1.name > s2.name)
		return true;
	else
		return false;
	


int main( ) 
scanf( "%d\\n",&n);
for(int i = 0; i < n; i++) 
cin >> student[i].name >> student[i].grade;

sort(student, student+n,cmp);for( int i = 0; i < n; i++) 
cout << student[i].name << endl;

return 0;


50. MT1600 综合测评

(1)题目描述 综合测评成绩Z,指的是学生学习成绩X,思想品德成绩S,体育素质成绩T的加权相加(Z=R * X +s * S +t * T )。

输入n个学生的名字,学习成绩X,思想品德成绩S,体育素质成绩T,求综合测评成绩从高到低排序的名单。如果成绩相同,则按字典序降序排序。

格式

样例1

(2)参考代码

#include<bits/stdc++.h> 
using namespace std;
typedef long long ll ;
#define MAX_NUM 10010
#define PI 3.1415926
double res;
int ans, n, m, k,len,cnt = 0,minn = MAX_NUM, maxx = 0;
char ch, s1[MAX_NUM] = "", s2[MAX_NUM] = "";
bool flag = false;
int a[MAX_NUM]= 0,b[MAX_NUM]= 0;
double x,s,t;

struct Student
string name;
int grade;
int X,S,T;
double zongfen;
student[ MAX_NUM];

bool cmp(Student s1,Student s2)  //cmp true不用交换位置false需要交换位置
if( s1.zongfen != s2.zongfen) 
	if(s1.zongfen > s2.zongfen)
		return true;
	else
		return false;
else 
	if(s1.name > s2.name)
		return true;
	else
		return false;
	


int main( ) 
scanf( "%d\\n",&n);
scanf("%lf %lf %lf\\n", &x,&s,&t);for(int i = 0; i < n; i++) 
cin >> student[i ].name >> student[i].X >> student[i].S >>
student[i].T;
student[i].zongfen = x*student[i].X + s*student[i].S +t*student[i].T;

sort(student, student+n,cmp);for( int i = 0; i < n; i++) 
cout << student[i ].name << endl;

return 0;


结语

希望这些题能帮助到大家,一起进步,祝愿每一个算法道路上的“苦行僧”们,都能够历经磨难,终成正果,既然选择了这条路,走到了这里,中途放弃,岂不是太过可惜?

愿你的结局,配得上你一路的颠沛流离。

以上是关于算法竞赛入门码蹄集新手村600题(MT1551-1600)的主要内容,如果未能解决你的问题,请参考以下文章

算法竞赛入门码蹄集新手村600题(MT1401-1450)

算法竞赛入门码蹄集新手村600题(MT1201-1250)

算法竞赛入门码蹄集新手村600题(MT1551-1600)

算法竞赛入门码蹄集新手村600题(MT1101-1150)

算法竞赛入门码蹄集新手村600题(MT1301-1350)

算法竞赛入门码蹄集进阶塔335题(MT2286-2290)