11.24cf题总结

Problem - 1095A - Codeforcesicon-default.png?t=N7T8https://codeforces.com/problemset/problem/1095/A今天相对都是一些水题,将就着看吧

这题就是一个单纯的字符串

我们直接遍历输入的字符串 然后用一个k标记要经过k个字符  每当经过k个字符 直接输出对应下标的字符 然后重置k并且比之前+1;

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

int main() {
	int n;
	cin >> n;
	string s1;
	cin >> s1;
	int num = 1;
	int k = 2;
	for (int i = 0; i < n; i++) {
		num--;
		if (num == 0) {
			cout << s1[i];
			num = k;
			k++;
		}
	}
	return 0;
}

Problem - 1077A - Codeforcesicon-default.png?t=N7T8https://codeforces.com/problemset/problem/1077/A这个题目也是一个模拟 我先往右走a步 接下来我往左走b步 然后继续重复 一共走k步 

具体代码为:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

int main() {
	int t;
	cin >> t;
	while (t--) {
		long long  a, b, k;
		cin >> a >> b >> k;
		if (k % 2 == 0)cout << (a - b) * (k/2)<<'\n';
		else cout <<(a-b)*(k/2)+a  <<'\n';
	}
	return 0;
}

Problem - 1594A - Codeforcesicon-default.png?t=N7T8https://codeforces.com/problemset/problem/1594/A这个题目就是给你一个n 让你找出两个数字 l和r 使得[l,r]这范围里面的数字加起来为n

可能一开始我们的思路找不到 会去寻找公式其中的规律 

但仔细一想 如果我的范围为[-n+1,n] 那么我这区间之间的和就为n

那我们直接输出-n+1 和 n  就是我们的正确答案了

具体代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

int main() {
	int t;
	cin >> t;
	while (t--) {
		long long n;
		cin >> n;
		cout << -n + 1 << " " << n << '\n';
	}
	return 0;
}

Problem - 849A - Codeforcesicon-default.png?t=N7T8https://codeforces.com/problemset/problem/849/A这个题目的意思是 我给一串数字 要求:

1.截取的数组的首尾的数字都为奇数

2.截取的数组里面的数字的个数为奇数

3.最后总共截取的数组的个数为奇数

可能我们一开始会没有思路 这个题目我们应该怎么写 

但是 毕竟是A题 它还是有比较巧妙的方法去解决 

我们只要保证我们给的数组的头和尾的数字都为奇数即可

为什么? 如果我们的头或者尾的数字是奇数 那么最后不管怎么分 都是不可能完成第一个条件的

当我们头和尾的数字为奇数的时候 我们不用进行分的操作 直接把我们全部的数字当成一组即可

这样满足三个条件 这么说是不是很简单?

具体代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
const int N = 105;
int a[N];
int main() {
	int n;
	cin >> n;
	if (n % 2 == 0) cout << "No";
	else {
		for (int i = 1; i <= n; i++)cin >> a[i];
		if (a[1] % 2 == 0 || a[n] % 2 == 0)cout << "No";
		else cout << "Yes";
	}
	return 0;
}

  Problem - 1406B - Codeforcesicon-default.png?t=N7T8https://codeforces.com/problemset/problem/1406/B

这个题目就是让我们找五个数字 乘起来最大

我们只需要将这串数组从小到大进行排序排一次 存在数组a1

再将数组从大到小进行排序一次 存在数组a2

然后分别从两个数组里面取数字 一共取五个 然后取最大值

因为我们最大五个数字 要么是大的正数乘 要么是小的负数乘起来  我们只需要取两头

然后给他们进行相乘  要么多取正数 要么多取负数  至于取几个正数几个负数 直接循环即可

具体代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 1e5 + 5;

int a1[N], a2[N];
bool cmp(int x, int y) {
	return x > y;
}
int main() {
	int t;
	cin >> t;
	while (t--) {
		int n;
		cin >> n;
		for (int i = 1; i <= n; i++) {
			cin >> a1[i];
			a2[i] = a1[i];
		}
		sort(a1 + 1, a1 + 1 + n);
		sort(a2 + 1, a2 + 1 + n, cmp);
		long long max1 =-1e18;
		for (int i = 0; i <= 5; i++) {
			int j = 5 - i;
			long long  tmp = 1;
			for (int k = 1; k <= i; k++)tmp *= a1[k];
			for (int k = 1; k <= j; k++)tmp *= a2[k];
			max1 = max(max1, tmp);
		}
		cout << max1 << '\n';
	}
	return 0;
}
	//long long res = k-1;
/** k *= 2;
	k--;
	for (int i = 0; i < 62; i++) {
		long long p = 1ll << i;
		if (k - p <= n) {
			cout << k - p << endl;
			return 0;
		}
	}*/

Problem - A - Codeforcesicon-default.png?t=N7T8https://codeforces.com/contest/1901/problem/A这个题目就是给我们几个站点 能够加油 然后问我们油箱的最小体积 能够支持我们来一次往返

那么我们就只要将每个加油站的距离 以及 出发点和第一个站点的距离 以及 (最后一个站点离终点的距离)*2(因为是往返) 进行比较 得出我们的最大距离 这个就是我们的油箱的最小体积

具体代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 200;
int a[N];
int main() {
	int t;
	cin >> t;
	while(t--){
		int n, x;
		cin >> n >> x;
		for (int i = 1; i <= n; i++) {
			cin >> a[i];
		}
		int max1 = a[1];
		for (int i = 2; i <= n; i++) {
			max1 = max(a[i] - a[i - 1], max1);
		}
		max1 = max((x - a[n]) * 2, max1);
		cout << max1 << '\n';
	}
	return 0;
}

 Problem - B - Codeforcesicon-default.png?t=N7T8https://codeforces.com/contest/1901/problem/B

这个题目感觉有点连续子串的那种味道 但做法不一样 

这个题目的思路是 我们从头开始 因为如果我们头很大 就算我们后面的数字很小 我们最后还是要传送到最一开始

因此 我们只需要预先将传送次数=a[0]-1  我们至少要这么多传送次数

之后呢 往后进行循环 如果我后面的数字比前面的数字大 说明什么? 我前面的数字一定比我先为0

那我之后想变为0 只能通过传送这个方法 那么传送次数就加一

具体代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

const int N = 2e5 + 5;
long long arr[N];

int main() {
    int t;
    cin >> t;

    while (t--) {
        int n;
        cin >> n;

        for (int i = 0; i < n; i++) {
            cin >> arr[i];
        }

        long long ans = arr[0] - 1;
        for (int i = 1; i < n; i++) {
            if (arr[i] > arr[i - 1]) {
                ans += (arr[i] - arr[i - 1]);
            }
        }

        cout << ans << '\n';
    }

    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值