【PAT】1008/1012/1018

22 篇文章 0 订阅
/*
*时间:2018年4月2日08:19:04-2018年4月2日08:50:17
*题号:1008. 数组元素循环右移问题
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:

一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,
即将A中的数据由(A0 A1……AN-1)变换为(AN-M …… AN-1 A0 A1……AN-M-1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:每个输入包含一个测试用例,第1行输入N ( 1<=N<=100)、M(M>=0);第2行输入N个整数,之间用空格
分隔。

输出格式:在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:

6 2
1 2 3 4 5 6

输出样例:

5 6 1 2 3 4
*/

#include <iostream>
using namespace std;

int main ()
{
	int A[200];		//建立A,由于A的容量N小于100,循环的M%N的余数小于100,所以循环后不会超过200
	int N, M;
	cin>>N>>M;
	int i;
	for (i=0; i<N; i++)  //输入数组A,下表上限是N-1
	{
		cin>>A[i];
	}
	M = M % N;
	for (i=N-1; i>=0; i--)  //先整体右移M位
	{
		A[i+M] = A[i];
	}
	for (i=0; i<M; i++)     //前M位赋值为溢出的M位
	{
		A[i] = A[N+i];
	}
	for (i=0; i<N-1; i++)   //只输出数组前N个,达到题目要求即可
	{
			cout<<A[i]<<" ";
	}
	cout<<A[N-1]<<endl;     //单独输出A[N-1]由于其后面无空格
	return 0;
}
/*
*这题有点钻空子了,并没有让数组达到右移的目的,只是让结果满足要求,其实只要从N-M输出到M再
*从0输出到N-M-1更简便。
*那么如何真正改变数组呢?
*/



/*
*时间:2018年4月2日19:38:58-2018年4月2日2018年4月2日20:48:31
*题号:1012. 数字分类
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:

给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:
A1 = 能被5整除的数字中所有偶数的和;
A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4...;
A3 = 被5除后余2的数字的个数;
A4 = 被5除后余3的数字的平均数,精确到小数点后1位;
A5 = 被5除后余4的数字中最大数字。

输入格式:

每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N,随后给出N个不超过1000的待分类的
正整数。数字间以空格分隔。

输出格式:

对给定的N个正整数,按题目要求计算A1~A5并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。

若其中某一类数字不存在,则在相应位置输出“N”。
输入样例1:

13 1 2 3 4 5 6 7 8 9 10 20 16 18

输出样例1:

30 11 2 9.7 9

输入样例2:

8 1 2 4 5 6 7 9 16

输出样例2:

N 11 2 N 9
*/

#include <iostream>
#include <math.h>
#include <stdio.h>
using namespace std;

int main()
{
	int N;
	cin>>N;
	int S[N];
	int i;
	int A1 = 0;
	int A2 = 0;
	int A3 = 0;
	double A4 = 0;
	int A5 = 0;
	int count_A2 = 0;
	double count_A4 = 0;
	
	for (i=0; i<N; i++)
	{
		cin>>S[i];
	}
	for (i=0; i<N; i++)
	{
		if (S[i]%10 == 0)       //10的倍数
		{
			A1 += S[i];
		}
		else if (S[i]%5 == 1)    //(-1)^i * ni
		{
			A2 += pow(-1, count_A2) * S[i];
			count_A2++;
		}
		else if (S[i]%5 == 2)
		{
			A3++;
		}
		else if (S[i]%5 == 3)
		{
			A4 += S[i];
			count_A4++;
		}
		else if (S[i]%5 == 4)
		{
			A5 = (S[i] > A5)? S[i]: A5; 
		}
	}
	A4 = ((A4 == 0)? 0: (A4/count_A4));
	if (A1 == 0)
		cout<<"N"<<" ";
	else
		cout<<A1<<" ";
	
    if (count_A2 == 0)
		cout<<"N"<<" ";
	else
		cout<<A2<<" ";
	
	if (A3 == 0)
		cout<<"N"<<" ";
	else
		cout<<A3<<" ";

	if (A4 == 0)
		cout<<"N"<<" ";
	else
		printf("%.1f ", A4);
	
	if (A5 == 0)
		cout<<"N";
	else
		cout<<A5;
	
	return 0;
}

/*
*19分,还没检查出错误
*把A1-A5包装成数组会稍微好一点
*/



/*
*时间:2018年4月2日21:23:30-2018年4月2日22:00:38
*题号:1018. 锤子剪刀布
*语言:C++ (g++ 4.7.2)
*分数:20
*题目描述:

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入格式:

输入第1行给出正整数N(<=105),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同
时给出的的手势。C代表“锤子”、J代表“剪刀”、B代表“布”,第1个字母代表甲方,第2个代表乙方,中间有1个
空格。

输出格式:

输出第1、2行分别给出甲、乙的胜、平、负次数,数字间以1个空格分隔。第3行给出两个字母,分别代表甲、
乙获胜次数最多的手势,中间有1个空格。如果解不唯一,则输出按字母序最小的解。
输入样例:

10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J

输出样例:

5 3 2
2 3 5
B B
*/

#include <iostream>

using namespace std;

int main()
{
	int n;
	cin>>n;
	char J[n];                   //甲乙的手势
	char Y[n];
	int i;
	for (i=0; i<n; i++)
	{
		cin>>J[i]>>Y[i];
	}
	int count_JS = 0;	      //甲乙胜利的次数和平局次数
	int count_YS = 0;
	int count_P = 0;
	int handJ[3] = {0};           //甲乙胜利时的手势
	int handY[3] = {0};
	
	for (i=0; i<n; i++)
	{
		if (J[i] == Y[i])              //平局直接跳过,下面用的是else,所以加不加continue一样
		{
			count_P++;
			//continue;
		}
		else if (J[i] == 'C')          //甲出锤子时
		{
			if (Y[i] == 'J')       //乙出剪刀,甲胜利次数加1,甲的手势为锤子加1
			{                      //hand[0]-hand[2]分别代表锤子、剪刀、布
				count_JS++;         
				handJ[0]++;
			}
			else
			{
				count_YS++;
				handY[2]++;
			}	
		}
		else if (J[i] == 'J')
		{
			if (Y[i] == 'B')
			{
				count_JS++;
				handJ[1]++;
			}
			else
			{
				count_YS++;
				handY[0]++;
			}			
		}
		else
		{
			if (Y[i] == 'C')
			{
				count_JS++;
				handJ[2]++;
			}
			else
			{
				count_YS++;
				handY[1]++;
			}
		}
	}
	cout<<count_JS<<" "<<count_P<<" "<<count_YS<<endl;    //先输出甲乙的胜利次数和平局次数
	cout<<count_YS<<" "<<count_P<<" "<<count_JS<<endl;
	//注意:如果B,C,J的次数有相同,按照字母顺序决定打印的手势,所以把输出B的放到最前面,其次是C
	if (handJ[2] >= handJ[0] && handJ[2] >= handJ[1])  cout<<"B"<<" ";
	else if (handJ[0] >= handJ[1] && handJ[0] >= handJ[2])  cout<<"C"<<" ";
	else  cout<<"J"<<" ";

	if (handY[2] >= handY[0] && handY[2] >= handY[1])  cout<<"B";
	else if (handY[0] >= handY[1] && handY[0] >= handY[2])  cout<<"C";
	else  cout<<"J";
	
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值