比赛算法入门day1——高精度与其它模拟
高精
高精:数据类型的容纳的数字范围有限,有时需要用数组来模拟非常长的整数。
代码:
//高精加法
#include
using namespace std;
#define maxn 510
int a[maxn],b[maxn],c[maxn];
int main()
{
string A,B;
cin>>A>>B;
int len=max(A.length(),B.length());
for(int i=A.length()-1,j=0;i>=0;i--,j++)
{
a[j]=A[i]-'0';
}
for(int i=B.length()-1,j=0;i>=0;i--,j++)
{
b[j]=B[i]-'0';
}//倒序存入数组
for(int i=0;i=0;i--)cout<
//高精乘法
//先计算每一位贡献再处理进位
#include
#define maxn 4100
using namespace std;
int a[maxn],b[maxn],c[maxn];
int main()
{
string A,B;
cin>>A>>B;
if(A=="0"||B=="0")cout<<0;//乘积为0的情况单独考虑
else
{
int lena=A.length(),lenb=B.length();
for(int i=lena-1;i>=0;i--)a[lena-1-i]=A[i]-'0';
for(int i=lenb-1;i>=0;i--)b[lenb-1-i]=B[i]-'0';//逆序存入数组
for(int i=0;i=0;i--)
cout<
模拟
模拟:找不到更加高效的做法时,题目怎么描述就让程序怎么运行。
P1042 [NOIP2003 普及组] 乒乓球
题目描述:
华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(截至记录末尾)。
比如现在有这么一份记录,(其中W表示华华获得一分,L表示华华对手获得一分):
WWWWWWWWWWWWWWWWWWWWWWLW
在11分制下,此时比赛的结果是华华第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分11比11。而在21分制下,此时比赛结果是华华第一局21比0获胜,正在进行第二局,比分2比1。如果一局比赛刚开始,则此时比分为0比0。直到分差大于或者等于2,才一局结束。
你的程序就是要对于一系列比赛信息的输入(WLWL形式),输出正确的结果。
代码如下:
#include
using namespace std;
int sz[2]={11,21};//代表两种分制
bool a[25*2500];
int main()
{
char tmp;//tmp有“临时”的含义
int n=0;
while(1)
{
cin>>tmp;
if(tmp=='E')break;
else if(tmp=='W')a[n++]=1;//华华赢
else if(tmp=='L')a[n++]=0;//华华输
}
for(int k=0;k<2;k++)
{
int w=0,l=0;
for(int i=0;i=sz[k]&&abs(w-l)>=2)//达到对应分数并超出对手两分
{
cout<
P2670 [NOIP2015 普及组] 扫雷游戏
题目描述
扫雷游戏是一款十分经典的单机小游戏。在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。
现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。
输入 | 3 3 *? ? ??? ?*? |
---|---|
输出 | *10 221 1*1 |
代码如下:
#include
using namespace std;
const int dx[]={1,1,1,-1,-1,-1,0,0};//代表x方向偏移量
const int dy[]={1,0,-1,1,0,-1,1,-1};//代表y方向偏移量
char p[102][102];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>p[i][j];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(p[i][j]=='*')cout<<"*";
else
{
int cnt=0;//cnt有计数器的含义
for(int k=0;k<8;k++)
{
if(p[i+dx[k]][j+dy[k]]=='*')cnt++;
}//这样表示更加简洁
cout<