pta数据结构day12

总结:用时2小时出头,写了 8道简单题,学到了一些处理方法;比如使用map,long long;

回文串,简单模拟题

#include<iostream>
#pragma warning(disable:4996)
using namespace std;

int main() {
	string ss;
	cin >> ss;
	int i;
	for (i = 0; i < ss.size()/2; i++) {//不需要等于
		if (ss[i] != ss[ss.size() - 1 - i]) {
			break;
		}
	}
	if (i < ss.size() / 2) {
		cout << "NO\n";
	}
	else {
		cout << "YES\n";
	}
	return 0;
}

题目详情 - 1009 说反话 (pintia.cn) 

 思路:输入数组中,再逆序输出即可;值得注意的是输入时用到EOF;

#include<iostream>
#include<vector>
#pragma warning(disable:4996)
using namespace std;

int main() {
	vector<string>v;
	string s;
	while (cin>>s&&!cin.eof()) {
		v.push_back(s);
	}
	for (vector<string>::iterator i = v.end() - 1; i != v.begin(); i--) {
		cout << *i << ' ';
	}
	cout << *v.begin();
	return 0;
}

题目详情 - 1011 A+B 和 C (pintia.cn) 

 idea:才知道long就是long int,都是32位,所以这题可能溢出,选择long long即64位整数,不会溢出;

#include<iostream>
using namespace std;

int main() {
	int n;
	long long a, b, c;
	int index = 1;
	cin >> n;
	while (n--) {
		cin >> a >> b >> c;
		cout << "Case #" << index << ": ";
		if (a + b > c) {
			cout << "true\n";
		}
		else {
			cout << "false\n";
		}
		++index;
	}
	return 0;
}

题目详情 - 1016 部分A+B (pintia.cn) 

没啥说的,好简单 

#include<iostream>
using namespace std;

int main() {
	int a, da, b, db;
	cin >> a >> da >> b >> db;
	int sum = 0,sum2=0;
	while (a) {
		if (a % 10 == da) {
			sum = 10 * sum + da;
		}
		a /= 10;
	}
	while (b) {
		if (b % 10 == db) {
			sum2 = 10 * sum2 + db;
		}
		b /= 10;
	}
	cout << sum + sum2;
	return 0;
}

 题目详情 - 1026 程序运行时间 (pintia.cn)

#include<iostream>
using namespace std;
#define CLK_TCK 100
int main() {
	int c1, c2;
	cin >> c1 >> c2;
	int time = 1.0*(c2 - c1)/CLK_TCK+0.5;//四舍五入
	int m = time / 60 % 60;
	int s = time % 60;
	int h = time / 60 / 60;
    printf("%02d:%02d:%02d",h,m,s);//2位
	return 0;
}

题目详情 - 1046 划拳 (pintia.cn) 

 

#include<iostream>
#include<vector>
#pragma warning(disable:4996)
using namespace std;

int main() {
	int n;
	int x, x1, y, y1;
	cin >> n;
	int ctn1 = 0, ctn2 = 0;
	for (int i = 0; i < n; i++) {
		cin >> x >> x1 >> y >> y1;
		if (x + y == x1&&x+y!=y1) {
			++ctn2;
		}
		if (x + y != x1 && x + y == y1) {
			++ctn1;
		}
	}
	cout << ctn1 <<' '<< ctn2;
	return 0;
}

题目详情 - 1008 数组元素循环右移问题 (pintia.cn) 

思路:这题值得一提,之前写过很多次,最近记录的是用三次翻转搞定,省事;一看书上答案,是我上个学期学的直接打印出来,抓住系统漏洞,太搞了;

#include<iostream>
#include<vector>
using namespace std;

void reverse(int arr[], int k) {
	for (int i = 0; i < k/2; i++) {
		int temp = arr[i];
		arr[i] = arr[k - i-1];
		arr[k - i-1] = temp;
	}
}
int main() {
	int n, k;
	cin >> n >> k;
    k%=n;//注意k>n的情况
	int arr[101];
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
	}
	//3 reverse
	reverse(arr, n);
	reverse(arr, k);
	reverse(arr + k, n - k);
	//print
	for (int i = 0; i < n; i++) {
		if (i != 0) {
			cout << ' ';
		}
		cout << arr[i];
	}
	return 0;
}

偷鸡:

 

题目详情 - 1012 数字分类 (pintia.cn) 

思路:用2个数组储存,一个答案,一个是否出现此情况,方便后面的打印;用switch也使代码简单易读; 

#include<iostream>
#include<vector>
using namespace std;

int main() {
	int n,m,flag=1;
	cin >> n;
	int arr[5] = { 0 };
	int ctn[5] = { 0 };
	double A4 = 0;
	for (int i = 0; i < n; i++) {
		cin >> m;
		switch (m%5)
		{
		case 0:
			if (m % 2 == 0) {
				arr[0] += m;
				ctn[0]++;
			}
			break;
		case 1:
			arr[1] += flag * m;
			flag = -flag;
			ctn[1]++;
			break;
		case 2:
			++arr[2];
			ctn[2]++;
			break;
		case 3:
			A4 += m;
			++arr[3];
			ctn[3]++;
			break;
		case 4:
			ctn[4]++;
			if (arr[4] < m) {
				arr[4] = m;
			}
			break;
		default:
			break;
		}
	}
	for (int i = 0; i < 5; i++) {
		if (i != 0) {
			cout << ' ';
		}
		if (ctn[i] == 0) {
			cout << 'N';
		}
		else if(i==3) {
			printf("%.1f", A4 / arr[i]);
		}
		else {
			cout << arr[i];
		}
	}
	return 0;
}

 

 题目详情 - 1018 锤子剪刀布 (pintia.cn)

这题值得一写,主要是字符和数字的互相转换这一块 

#include<iostream>
#include<map>
using namespace std;

int main() {
	map<char, int>mp;//字符转成数字,按字母序排列
	mp['B'] = 0;//0>1,1>2,2>0---win: (c1+1)%3==c2 , same: c1=c2, lose: else
	mp['C'] = 1;
	mp['J'] = 2;
	char trans[3] = { 'B','C','J' };//数字转成字符
	int n;
	cin >> n;
	char c1,c2;
	int arr[3] = { 0 }, arr2[3] = { 0 };//胜负平次数
	int ch[3] = { 0 }, ch2[3] = { 0 };//bcj次数
	while (n--) {
		cin >> c1 >> c2;
		int x = mp[c1], y = mp[c2];
		if ((x + 1) % 3 == y) {
			++ch[x];//获胜手势次数加1
			++arr[0];//胜利加1
			++arr2[2];//另外的人失败加1
		}
		else if (x == y) {
			++arr[1];
			++arr2[1];
		}
		else {
			++ch2[y];
			++arr[2];
			++arr2[0];
		}
	}
	cout << arr[0] << ' ' << arr[1] << ' ' << arr[2] << endl;
	cout << arr2[0] << ' ' << arr2[1] << ' ' << arr2[2] << endl;
	int max1 = 0, max2 = 0;
	for (int i = 0; i < 3; i++) {
		if (ch[i] > ch[max1]) {
			max1 = i;
		}
		if (ch2[i] > ch2[max2]) {
			max2 = i;
		}
	}
	cout << trans[max1] << ' ' << trans[max2];
	return 0;
}

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值