数据结构基础

博客包含多个ACM题目,有求longlong下最大有效斐波那契数,将输入数的小数部分转int输出,计算画板上偶数凑对数量,以及计算校园绿化种树数量等问题,给出了题目描述、输入输出要求和样例。

问题 A: longlong下最大的有效斐波那契数

题目描述
请输出longlong情况下最大的有效斐波那契数
输入
该题无输入
输出
请输出longlong情况下最大的有效斐波那契数
样例输入

样例输出

#include<stdio.h>
#include <stdlib.h>
int main()
{
    long long int pre = 0;
    long long int cur = 1;
    long long int next = 0;
    long long int cnt = 1;
    while (1)
    {
        next = cur + pre;
        pre = cur;
        cur = next;
        if (cur + pre < cur)   //当溢出时会变为负  当超过long long的范围时会从负数开始
            break;
    }
    printf("%lld", cur);
    return 0;
}

问题 B: 只要小数部分

题目描述
输入一个数(保证这个数的整数部分和小数部分都在int范围内)
请将小数部分转换成int形式并输出
输入
连续输入
每一行输入一个数(保证这个数的整数部分和小数部分都在int范围内)
输出
请输出小数部分的(int)形式
样例输入
123.456
样例输出
456

#include <stdio.h>
#include<stdlib.h>
void main()
{
	int inter_part;
	unsigned fractional_part;
	char buf[80];

	while (scanf("%s", buf) != EOF) {
		sscanf(buf, "%d.%u", &inter_part, &fractional_part);
			printf("%d\n",  fractional_part);
	}
		system("pause");
}
注意:如,当小数部分为001时,输出应为1,而不是001

问题 C: 孪生小姐妹

题目描述
小颖和小静是一对小姐妹,所以她们喜欢所有事都成双成对
深受老师宠爱的小颖从老师那里拿来了一块画板,画板上刻着很多数字。
小颖和小静看到画板上的偶数,希望能够将画板上存在的偶数凑对,凑对的偶数相加等于她们最喜欢的数字L,但是画板上的数字有很多,而且会出现重复的数字,她们希望你能编写一个程序来计算画板上的偶数能够凑出多少对她们喜欢的数字。
输入
本题有多组测试样例。
每组测试样例的第一行包括两个数字n 和 L(2<= n <= 100000 0<= l <= 10000)
第二行包括n个数字ai i = 1 2 3…n (0<= ai <= 10000)
输出
输出一个数字,表示有多少对偶数能凑成 L这个数字, 给出的每个数字只能用一次,如果凑不出来任何一对的情况下,输出"what a pity!!!"
样例输入
3 6
1 2 4
5 10
2 8 4 6 9
4 10
1 2 9 6
样例输出
1
2
what a pity!!!
提示
每个数字不一定只有一个, 比如可以
6 4
1 1 2 2 3 4
答案是 1


用哈希表


#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int num[10007];
int main()
{
	int n, l;

	while (scanf("%d %d", &n, &l) != EOF) {
		memset(num, 0, sizeof num);
		int temp;
		for (int i = 0; i < n; ++i) {
			cin >> temp;
			num[temp]++;
		}
		// for (int i = 0; i < 10; ++i) cout << num[i] << " ";

		int sum = 0;
		for (int i = 0; i <= 10000; i += 2) {
			if (i <= l) {
				if (num[i]!=0 && num[l - i] ) {
					if (i != l - i) {
                                                int x = min(num[i], num[l - i]);
						sum += x;
						num[i] -= x;
						num[l - i] -= x;
					}else {
						while (num[i] >= 2) {
							num[i] -= 2;
							sum++;
						}
					}
				}
			}else break;
		}
		if (sum == 0) cout << "what a pity!!!" << endl;
		else cout << sum << endl;
	}
	return 0;
}

问题 I: 美丽校园——绿化I

题目描述
科大要建设美丽校园啦,而交给你的任务就是计算要买多少颗树。
学校决定要在大小为NM的空地里的多个区域种树(空地的左上角坐标为(1,1),表示第1行第1列的空间)。
并且给出多个需要种树的区域(该区域保证完全在上述空地内,不存在有超出给定空地的部分)。
每次给定两个坐标(X1,Y1)、(X2,Y2),表示左上角为(X1,Y1),右下角为(X2,Y2)的需要种树的区域(包含端点的边界)。
对于每一个面积为1的空间,如果已经有了树,则不需要重复种树,如果没有树,则需要种上一棵树。
坐标(x,y)表示第x行第y列的空间。
输入
测试数据包含多组测试样例。
对于每一组测试样例:
输入的第一行为三个数 N,M,K(0 <= N,M,K <= 1000),表示需要在 N
M 的空地里的 K 个区域种满树。
接下来有 K 行,每行4个正整数 X1,Y1,X2,Y2(1 <= X1 <=X2 <= N,1 <= Y1 <= Y2 <= M)。
当N=M=K=0时结束程序,不需要做任何输出。
输出
对于每个测试样例输出一个数字,表示树木的数量,占一行。

#include<stdio.h>
int a[1001][10001];
int main(){
	int n,m,k;
	while(scanf("%d %d %d",&n,&m,&k)&&(n||m||k)){
		
	int flag=0;
		while(k--){
			int x1,y1,x2,y2;
			scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
			for(int i=y1;i<=y2;i++)
			   for(int j=x1;j<=x2;j++){
				   if(a[i][j]!=1)
				       a[i][j]=1;
			}
			
		} 
			
		for(int i=1;i<=m;i++)
	     	for(int j=1;j<=n;j++)
		        if(a[i][j]==1)
		         flag++;
		  printf("%d\n",flag);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值