第三周算法周报

P2181 对角线
题目描述
对于一个 n 个顶点的凸多边形,它的任何三条对角线都不会交于一点。请求出图形中对角线交点的个数。

例如,6 边形:在这里插入图片描述
这里可以注意到并没有出现多条对角线交叉在一个点的情况。

#include <iostream>

using namespace std;

int main()
{
	long long int n = 0;
	cin >> n;
	long long int ans = 0;
	long long int temp = 1;
	while (temp < (n - 2))
	{
		ans += temp * (n - temp - 2);
		temp++;
	}
	if (n % 4 == 0)
	{
		n /= 4;
	}
	else if (n % 2 == 0)
	{
		n /= 2;
		ans /= 2;
	}
	else
	{
		ans /= 4;
	}
	ans *= n;
	cout << ans << endl;
	return 0;
}

思路:1.先选择一条对角线,将多边形分为两个部分,一边是一个点的,另一边是剩下的点,两边的点相连形成的对角线与所选择的对角线相交形成交点。
2.以此类推,现分为一边是1个点的,然后这一边的点逐渐增加,直到另外一边也只剩下一个点为止。需要特别注意的是,这样的每一组对角线都有n条,这样重复计算了比如点c到点b和点b到点c,其实是同一条。再根据题意,每个交点是由两个对角线形成的,而我们在计算点的时候用每条对角线都计算了一次,所以又重复计算了一遍。也就是说,这样我们得到的ans是最终正确ans的4倍。
特别注意,我将乘n的操作挪到了外面,把除以4的操作提前了,避免在运算的过程中出现数据上溢的情况。

P1085 [NOIP2004 普及组] 不高兴的津津

题目描述
津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。

输入格式
输入包括77行数据,分别表示周一到周日的日程安排。每行包括两个小于1010的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。

输出格式
一个数字。如果不会不高兴则输出00,如果会则输出最不高兴的是周几(用1, 2, 3, 4, 5, 6, 71,2,3,4,5,6,7分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。

输入输出样例
输入
5 3
6 2
7 2
5 3
5 4
0 4
0 6
输出
3
说明/提示 noip2004普及组第1题

#include<stdio.h>
int main(){
	int i,j,c,d,b=0,a=0;//j<8就直接输出a=0
	for(int i=1;i<=7;i++){
		scanf("%d %d",&c,&d);
		j=c+d;
	if((j>b)&&(j>8)){
		b=j;
		a=i;
	}
}
	printf("%d\n",a);
	return 0;
} 

P1888 三角函数
题目描述
输入一组勾股数 a,b,c用分数格式输出其较小锐角的正弦值。(要求约分。)

输入格式
一行,包含三个正整数,即勾股数 a,b,c(无大小顺序)。

输出格式
一行,包含一个分数,即较小锐角的正弦值

输入输出样例
输入
3 5 4
输出
3/5

说明/提示
数据保证:a,b,ca,b,c 为正整数且 ∈[1,10 9 ]。

#include<bits/stdc++.h>//万能开头
using namespace std;
int main(){
	int a,b,c,i;
	cin>>a>>b>>c;
	if(a>b&&a>c){
		if(b>c){
			i=__gcd(a,c);
			cout<<c/i<<"/"<<a/i;
		}else{
			i=__gcd(a,b);
			cout<<b/i<<"/"<<a/i;
		}
	}else if(b>a&&b>c){
		if(a>c){
			i=__gcd(b,c);
			cout<<c/i<<"/"<<b/i;
		}else{
			i=__gcd(b,a);
			cout<<a/i<<"/"<<b/i;
		}
	}else if(c>b&&c>a){
		if(b>a){
			i=__gcd(a,c);
			cout<<a/i<<"/"<<c/i;
		}else{
			i=__gcd(b,c);
			cout<<b/i<<"/"<<c/i;
		}
	}
	return 0;
} 

注意:这题最重要的是约分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值