【PAT】第三章 入门模拟

第三章

3.1 简单模拟

1. A1002. A+B for Polynomials

polynomial n.多项式
exponent n.指数
coefficient n.系数
decimal place 小数位

#include <cstdio>

const int MAXN=2000;

double coe[MAXN]={};
int n,cnt=0;

int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		int e;
		double c;
		scanf("%d %lf",&e,&c); 	//double -> %lf
		coe[e]+=c;
		if(coe[e]!=0)
			cnt++;
	}
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		int e;
		double c;
		scanf("%d %lf",&e,&c);
		if(coe[e]==0) 	//cnt维护! 
			cnt++;
		coe[e]+=c;
		if(coe[e]==0)
			cnt--;
	}
	printf("%d",cnt);
	for(int i=MAXN-1;i>=0;i--) 	//要倒序输出 
	{
		if(coe[i]!=0)
			printf(" %d %.1f",i,coe[i]);
	}
}
  • 注意正负抵消问题
  • 输出末尾不能有空格
  • 自己维护长度时,还是在出了循环后-1吧
  • double,不要用float
数组相关

数组大小必须是常数。

给整个数组赋初值0。

//法一
int a[10]={0};
int a[10]={};
//法二
#include <string.h>
...
memset(数组名,,sizeof(数组大小)); 	//memset按字节赋值,赋0或-1不易错

未被赋初值的数组元素根据编译器实现的不同被赋予不同的初值。

scanf相关

头文件:stdio.h

数据类型格式符
int%d
long long%lld
float%f
double%lf
char%c
字符串(后面会加上结束符)%s

除了%c以外,scanf遇到空白符(空格、换行等)结束。例如,字符数组使用%s读入时,只读到第一个空白符前(空白符没有被读入)。

#include <cstdio>

int main()
{
	char str[10];
	scanf("%s",str);
	printf("%s",str);
	return 0;
}

//输入:abcd efg
//输出:abcd

读入空白符隔开的int型数据时,引号中可以没有空白符。

int a,b;
scanf("%d%d",&a,&b);
//输入:3 4

scanf%c格式可以读入空格、换行。

#include <cstdio>

int main()
{
	int a;
	char c,str[10];
	scanf("%d%c%s",&a,&c,str);
	printf("a=%d,c=%c,str=%s",a,c,str);
	return 0;
}

//输入:1 a bcd
//输出:a=1,c= ,str=a

//输入:1a bcd
//输出:a=1,c=a,str=a

在非%c格式下,scanf会忽略第一个非空白符前所有的空白符。

printf相关

%md:不足m位的以m位进行右对齐输出,高位空格补齐;超过m位的,保持原样。
%0md:高位用0补齐。
%.mf:浮点数保留m位小数输出。如果要求四舍五入,要用round函数。

数据类型格式符
int%d
long long%lld
float%f
double%f
char%c
字符串(后面会加上结束符)%s

2. A1042 Shuffling Machine (20 分)

shuffle n.洗牌
procedure n.过程,手续;步骤
randomize v.使随机化
deck n.转盘装置
casinos n.赌场
simulate v.模拟
permutation n.排列

ATTENTION

  • 取模还是很妙的。
  • 柳神将每次变化后的结果都存储在了end数组中,这里使用了两个数组轮换存储结果。
#include <cstdio>

int a[60],b[60],turn[60];
bool flag=0;
int k;

int main()
{
	scanf("%d",&k);
	for(int i=1;i<=54;i++)
		a[i]=i;
	for(int i=1;i<=54;i++)
		scanf("%d",&turn[i]);
	for(int i=0;i<k;i++)
	{
		for(int j=1;j<=54;j++)
		{
			int tmp=turn[j];
			if(!flag) 	//移到b里
				b[tmp]=a[j];
			else 	//移到a里 
				a[tmp]=b[j];	
		}
		flag=!flag;
	}
	for(int j=1;j<=54;j++)
	{
		if(!flag) 	//结果在a里
		{
//			if(a[j]>=1&&a[j]<=13)
//				printf("S%d",a[j]);	
//			else if(a[j]>=14&&a[j]<=26)
//				printf("H%d",a[j]-13);
//			else if(a[j]>=27&&a[j]<=39)
//				printf("C%d",a[j]-26);
//			else if(a[j]>=40&&a[j]<=52)
//				printf("D%d",a[j]-39);
//			else
//				printf("J%d",a[j]-52);
			char let[6]={"SHCDJ"};	//char
			printf("%c%d",let[(a[j]-1)/13],(a[j]-1)%13+1);
		}
		else
		{
//			if(b[j]>=1&&b[j]<=13)
//				printf("S%d",b[j]);	
//			else if(b[j]>=14&&b[j]<=26)
//				printf("H%d",b[j]-13);
//			else if(b[j]>=27&&b[j]<=39)
//				printf("C%d",b[j]-26);
//			else if(b[j]>=40&&b[j]<=52)
//				printf("D%d",b[j]-39);
//			else
//				printf("J%d",b[j]-52);
			char let[6]={"SHCDJ"};	//char
			printf("%c%d",let[(b[j]-1)/13],(b[j]-1)%13+1);
		}
		if(j!=54) printf(" ");
	}
	return 0;
}

3.6 字符串处理

1. 【例】A1082 Read Number in Chinese (25 分)

ATTENTION

  • 这道题做得十分惨烈,原因是没有想明白所有情况就开始写了,然后写着写着发现了一个点写着写着又发现了一个点。所以!像这种靠自己总结条件、并且较为复杂的题目!一定要!想明白再写!!!
  • 注意到,千百十是重复出现的,所以将输入的数从低位开始4位4位分离。所以!这道题,用int读入会比较好处理。

2. A1077 Kuchiguse (20 分)

Kuchiguse
notorious adj. 声名狼藉的,臭名昭著的
particle n. 颗粒;[物] 质点;极小量;小品词
exaggerated a.夸张的
artistically adv. 在艺术上;富有艺术地
Manga n. 日本漫画
stereotype n. 陈腔滥调,老套;成见;模式化形象;铅版,铅版(浇铸或印刷)
case sensitive 区分大小写的

//notorious exaggerated stereotype Kuchiguse
#include <iostream>
#include <vector>
#include <string>
using namespace std;
string sen[110];
vector<char> ans;
int n;
char c;

int main()
{
	cin>>n;
	getchar(); 	//!!!
	int length=300;
	for(int i=0;i<n;i++)
	{
		getline(cin,sen[i]);
		if(sen[i].size()<length)
			length=sen[i].size();
	}
	for(int i=0;i<length;i++)
	{
		bool flag=true;
		for(int j=1;j<n;j++)
		{
			if(sen[j][sen[j].size()-1-i]!=sen[0][sen[0].size()-1-i])
			{
				flag=false;
				break;
			}
		}
		if(flag)
		{
			ans.push_back(sen[0][sen[0].size()-1-i]);
		}
		else 	//要及时退出,因为要的是最长的连续后缀。否则前面可能会有同位置同字符的偶然 
			break;
	}
	if(ans.size()==0)
		cout<<"nai";
	else
		for(int i=ans.size()-1;i>=0;i--)
			cout<<ans[i];
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值