7.14题解

7.14 题解

问题 A: longlong下最大的有效斐波那契数
#include <stdio.h>
#include <string.h>
int main()
{
	long long f[1000];

	f[1] = f[2] = 1;
	for (int i = 3; i < 1000; ++i) {
		f[i] = f[i - 1] + f[i - 2];
		if (f[i] < 0) {
			printf("%lld\n", f[i - 1]);
			break;
		}
	}
	return 0;
}

问题 B: 只要小数部分
#include <stdio.h>
#include <string.h>
int main()
{
	int a, b;
  while (~scanf("%d.%d", &a, &b)) {
    printf("%d\n", b);
  }
	return 0;
}

字符串版本:

#include <stdio.h>
#include <string.h>
int main()
{
    char a[100], b[100];
    int c = 0;

    while (~scanf("%s", a)) {
        int t = 0, i = 0, j = 0, flag = 0, n, te = 0, d = 0;
        n = strlen(a);
        for (i = 0; i < n; i++) {
            if (a[i] == '.') {
                t = i + 1;
            }
        }
        flag = 1;
        for (i = t; i < n; i++) {
            if (a[i] != '0') {
                d = i;
                flag = 0;
                break;
            }
        }
        if (flag) {
            printf("0\n");
        } else {
            for (j = d; j < n; j++) {
                printf("%c", a[j]);
            }
            puts("");
        }
    }
    return 0;
}
问题 C: 孪生小姐妹
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int num[10007];
int main()
{
	int n, l;

	while (~scanf("%d %d", &n, &l)) {
		memset(num, 0, sizeof num);
		int temp;
		for (int i = 0; i < n; ++i) {
			scanf("%d", &temp);
			num[temp]++;
		}
		// for (int i = 0; i < 10; ++i) cout << num[i] << " ";
		if (l & 1) {
			printf("what a pity!!!\n");
			continue;
		}
		int sum = 0;
		for (int i = 0; i <= 10000; i += 2) {
			if (i <= l) {
				if (num[i] && num[l - i] ) {
					if (i != l - i) {
						while (num[i] && num[l - i]) {
							num[i]--, num[l - i]--, sum++;
						}
					}else {
						while (num[i] > 2) {
							num[i] -= 2;
							sum++;
						}
					}
				}
			}else break;
		}
		if (sum == 0) printf("what a pity!!!\n");
		else printf("%d\n", sum);
	}
	return 0;
}

问题 D: 边总的 Cherry 青轴

链表版代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
typedef struct Linklist {
	char x;
	struct Linklist* next;
}Linklist, * pLinklist;
char ch[100007];
int main()
{

	while (~scanf("%s", ch)) {
		pLinklist head, temp = NULL, end, now;

		head = (pLinklist)malloc(sizeof(Linklist));
		end = head;
		temp = (pLinklist)malloc(sizeof(Linklist));
		int i = 0;
		int ls = strlen(ch);
		for (; i < ls; ++i) {
			temp = (pLinklist)malloc(sizeof(Linklist));
			temp->x = ch[i];
			if (temp->x == 'E') continue;
			if (temp->x == 'H') {
 H:                             now = head;
				for (; i < ls; ++i) {
					if (ch[i] == 'H') {
						++i; goto H;
					}
					if (ch[i] == 'E') break;
					temp = (pLinklist)malloc(sizeof(Linklist));
					temp->x = ch[i];
					temp->next = now->next;
					now->next = temp;
					now = temp;
				}
			}else {
				end->next = temp;
				end = temp;
			}
		}
		end->next = NULL;
		for (temp = head->next; temp != NULL; temp = temp->next) {
			printf("%c", temp->x);
		}
		for (temp = head; temp->next != NULL; ) {
			pLinklist tem = temp;
			temp = temp->next;
			free(tem);
		}
		puts("");
		free(temp);
	}
	return 0;
}

数组模拟版本:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 1e5 + 7;
char a[maxn];
int nxt[maxn];
int main()
{
    while(scanf("%s", a + 1) == 1){
        memset(nxt, 0, sizeof nxt);
        int now = 0, last = 0;
        int len = strlen(a+1);
        for(int i = 1; i <= len; i++){
            if(a[i] == 'H'){
                now = 0;
            }
            else if(a[i] == 'E'){
                now = last;
            }
            else{
                nxt[i] = nxt[now];
                nxt[now] = i;
                if(now == last) last = i;
                now = i;
            }
        }
        for(int i = nxt[0]; i != 0; i = nxt[i]){
            printf("%c", a[i]);
        }
        printf("\n");
    }
    return 0;
}

问题 E: 可怜的船坞管理员
#include <cstdio>
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
	int stack[15];
	int top = 0;
	int n;
	int a[16], b[16];
	char ch1[50];

	while (~scanf("%d", &n)) {
		top = 0;
		for (int i = 0; i < n; ++i) {
			scanf("%1d", &a[i]);
		}

		for (int i = 0; i < n; ++i) {
			scanf("%1d", &b[i]);
		}
		stack[0] = -10;
		stack[++top] = a[0];
		ch1[0] = 'i';
		int k = 1;
		int t = 0;
		for (int i = 1; i < n;) {
			if (stack[top] == b[t]) {
				t++;
				top--;
				ch1[k++] = 'o';
			}else {
				stack[++top] = a[i];
				ch1[k++] = 'i';
				i++;
			}
		}
		if (top > 0) {
			while (stack[top] == b[t]) {
				--top, ++t;
				ch1[k++] = 'o';
			}
		}
		if (top > 0) {
			printf("No.\n");
			printf("Finish\n");
		}else {
			printf("Yes.\n");
			for (int i = 0; i < k; ++i) {
				if (ch1[i] == 'i') printf("In\n");
				if (ch1[i] == 'o') printf("Out\n");
			}
			cout << "Finish" << endl;
		}
	}
	return 0;
}

问题 F: 计算姬的烦恼

代码暂时先这么写,有些内容是明天的课了

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <map>
#include <queue>
#include <cstring>
#include <cmath>
#include <stack>
#include <string>
using namespace std;
typedef long long ll;
string a[120000];
int num[120000];
stack<ll> s;
int main()
{
	// map <string, int> mp;
	//
	// mp["+"] = 0;
	// mp["f"] = 1;
	// mp["e"] = 2;
	int n;
	ll k = 1LL * 10000000;

	scanf("%d", &n);
	memset(num, 0, sizeof num);
	for (int i = 0; i < n; ++i) {
		cin >> a[i];
		if (a[i][0] == 'f') cin >> num[i];
		// cout << a[i] << " " << num[i] << endl;
	}
	ll x = 0;
	ll tem = 1;
	// bool flag = false;
	bool flag_x = false;
	// cout << n << endl;
	for (int i = 0; i < n; ++i) {
		if (a[i][0] == '+' ) {
			if (s.empty()) x += 1;
			else x += s.top();
		}
		// cout << n << endl;
		if (a[i][0] == 'f') {
			if (s.empty()) tem = 1;
			else tem = s.top();
			tem *= num[i];
			if (tem > k) s.push(k + 1);
			else s.push(tem);
		}
		// cout << n << endl;
		if (a[i][0]  == 'e') {
			s.pop();
		}
		if (x > k) {
			flag_x = true;
			break;
		}
		// printf("%I64d %I64d %d\n", x, tem, top);
	}
	// std::cout << "1" << '\n';
	if (flag_x) printf("Go Out!!!\n");
	else printf("%lld\n", 1LL * x);
	return 0;
}


问题 G: 开心消消乐
#include <stdio.h>
int stack[100007];
int main()
{
	int top = 0;
	int n;

	while (~scanf("%d", &n)) {
		top = 0;
		int temp;
		int sum = 0;
		for (int i = 0; i < n; ++i) {
			scanf("%d", &temp);
			if (!top) {
				stack[++top] = temp;
			}else {
				if (temp == stack[top]) {
					top--;
					sum++;
				}else {
					stack[++top] = temp;
				}
			}
		}
		printf("%d\n", sum);
	}
	return 0;
}
问题H:零的忧伤
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <memory.h>
using namespace std;

int f1[1000005];        //保存得数是正的
int f2[1000005];        //保存得数是负的

int main()
{
	int i, j, k, sum;
	int a, b, c, d;

	while (scanf("%d %d %d %d", &a, &b, &c, &d) != EOF) {
		//abcd全部大于0或者小于0,肯定无解。要加上这个,不然超时
		if (a > 0 && b > 0 && c > 0 && d > 0 || a < 0 && b < 0 && c < 0 && d < 0) {
			printf("0\n");
			continue;
		}
		memset(f1, 0, sizeof(f1));
		memset(f2, 0, sizeof(f2));
		for (i = 1; i <= 100; i++) {
			for (j = 1; j <= 100; j++) {
				k = a * i * i + b * j * j;
				if (k >= 0) f1[k]++;    //k>=0 f1[k]++
				else f2[-k]++;          //k<0  f2[k]++
			}
		}
		sum = 0;
		for (i = 1; i <= 100; i++) {
			for (j = 1; j <= 100; j++) {
				k = c * i * i + d * j * j;
				if (k > 0) sum += f2[k];        //若k为正,加上的f2[k]
				else sum += f1[-k];             //若k为负,加上的f1[k]
			}
		}
		printf("%d\n", 16 * sum); //每个解有正有负,结果有2^4种
	}

	return 0;
}
问题 I: 美丽校园——绿化I
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int map[1005][1005];
int main(int argc, char const *argv[])
{
	int n, m, k;

	while (~scanf("%d %d %d", &n, &m, &k) ) {
		if (!n && !m && !k) break;
		memset(map, 0, sizeof(map));
		int a, b, c, d;
		for (int i = 0; i < k; ++i) {
			scanf("%d %d %d %d", &a, &b, &c, &d);
			for (int j = a; j <= c; ++j) {
				for (int s = b; s <= d; ++s) {
					map[j][s] = 1;
				}
			}
		}
		int sum = 0;
		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= m; ++j) {
				if (map[i][j]) sum++;
			}
		}
		cout << sum << endl;
	}
	return 0;
}

问题 J: 美丽校园——绿化II
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int map[55][55][55];
int main(int argc, char const *argv[])
{
	int n, m, k, l;

	while (~scanf("%d %d %d %d", &n, &m, &l, &k) ) {
		if (!n && !m && !k && !l) break;
		memset(map, 0, sizeof(map));
		int a, b, c, d, e, f;
		for (int i = 0; i < k; ++i) {
			cin >> a >> b >> c >> d >> e >> f;
			for (int j = a; j <= d; ++j) {
				for (int s = b; s <= e; ++s) {
					for (int t = c; t <= f; ++t)
						map[j][s][t] = 1;
				}
			}
		}
		int sum = 0;
		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= m; ++j) {
				for (int t = 1; t <= l; ++t)
					if (map[i][j][t]) sum++;
			}
		}
		cout << sum << endl;
	}
	return 0;
}

问题 K: 办理手机短号业务送话费
#include <cstdio>
#include <cstring>
int main()
{
	char num[20];

	while (~scanf("%s", num)) {
		printf("029");
		for (int i = 5; i < 11; ++i) {
			printf("%c", num[i]);
		}
    printf("\n"); //记得换行
	}
	return 0;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值