第三章
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;
}