1、3441:【例77.2】经验值
洛谷P1867_Mc生存经验值_入门难度_模拟
P1867 【Mc生存】经验值 C++
洛谷题解 P1867 【【Mc生存】经验值】
洛谷P1867 【Mc生存】经验值
https://shuiwa-coding.blog.csdn.net/article/details/113813991
/*
3441:【例77.2】经验值
http://bas.ssoier.cn:8086/problem_show.php?pid=3441
*/
#include <bits/stdc++.h>
using namespace std;
int n,a[100005],p[100005],pre[100005],nxt[100005],x,L,r;
long long sum;
int main( void )
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
a[i]=x;
p[x]=i;
pre[i]=i-1;
nxt[i]=i+1;
}
nxt[0]=1;
pre[n+1]=n;
for(int i=1;i<=n;i++)
{
cin>>x;
L=pre[p[x]];
r=nxt[p[x]];
sum+=a[L]+a[r];
nxt[L]=r;
pre[r]=L;
}
cout<<sum<<endl;
return 0;
}
2、3442:练77.1 队列复原
“队列复原”问题
队列复原2
51Nod 2159 队列复原2 c/c++题解
网易有道编程题:恢复队列(C++)
51nod 冲刺题
“队列复原”问题
#include <iostream>
using namespace std;
int a[100000];
int b[100000];
int main(){
int n;
cin >> n;
for(int i = 0; i < n; i ++){
int c, d;
cin >> c >> d;
a[d] = c;
}
int index = 0;
for(int i = 0; i < n; i ++){
b[i] = a[index];
index = a[index];
}
for(int i = n - 1; i >= 0; i --){
cout << b[i] << endl;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
struct node {
int n, p;
} l[100005];
int m, a, b;
int main() {
scanf("%d",&m);
//cin >> m;
for (int i = 1; i <= m; i++) {
cin >> a >> b;
l[a].n = b;
l[b].p = a;
}
int head = 0;
for (int i = 1; i <= m; i++) {
if (l[i].p == 0) {
head = i;
}
}
for (int o = head; o != 0; o = l[o].n) {
printf("%d\n",o);
//cout << o << endl;
}
return 0;
}
/*
3442:练77.1 队列复原
http://bas.ssoier.cn:8086/problem_show.php?pid=3442
*/
#include <bits/stdc++.h>
using namespace std;
int a[100000+10],b[100000+10];
int main( void )
{
int n,x,y,nn,m;
cin>>n;
m=n;
while( m--){
cin>>x>>y;
a[y]=x;
if( y==0 )
{
b[n]=x;
}
}
nn=n;
while( nn--)
{
b[nn]=a[b[nn+1]];
}
for(int i=1;i<=n;i++)
{
cout<<b[i]<<'\n';
}
return 0;
}
3、3443:【例78.1】忽明忽暗
2019 蓝桥杯省赛 A 组模拟赛(一)-忽明忽暗
#include<bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
long long ans,n;
int main()
{
scanf("%lld",&n);
long long t=sqrt(n);
ans=t*(t+1)/2;
if(ans%3==0)
ans=(ans/3)%mod*(2*t+1)%mod;
else
ans=(ans%mod*((2*t+1)/3)%mod)%mod;
cout<<ans<<endl;
return 0;
}
4、3444:【例78.2】大整数加法
[例 78.2] 大整数加法
1168:大整数加法
1168:大整数加法
C++信息学奥赛OJ讲解:1168:大整数加法(高精度加法)
1168:大整数加法
大整数加法(信息学奥赛一本通-T1168)
/*
1168:大整数加法
http://ybt.ssoier.cn:8088/problem_show.php?pid=1168
P1601 A+B Problem(高精)
https://www.luogu.com.cn/problem/P1601
1.6编程基础之一维数组 10:大整数加法
http://noi.openjudge.cn/ch0106/10/
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <bits/stdc++.h>
using namespace std;
int main( void )
{
//char a1[300],b1[300];
string a1,b1;
int a[300],b[300],c[300],lena,lenb,lenc,i,x;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
//输入加数与被加数
//gets(a1);
//gets(b1);
cin>>a1;
cin>>b1;
lena=a1.length();
lenb=b1.length();
//将输入字符串倒置
//加数放入a数组
for (i=0;i<=lena-1;i++) a[lena-i]=a1[i]-48;
/*
//加数放入a数组
for (i=0;i<=lena-1;i++) a[lena-i]=a1[i]-'0';
*/
//加数放入b数组
for (i=0;i<=lenb-1;i++) b[lenb-i]=b1[i]-48;
lenc =1;
x=0;
while ( lenc <=lena || lenc <=lenb )
{
//两数相加
c[lenc]=a[lenc]+b[lenc]+x;
x=c[lenc]/10;
c[lenc]%=10;
lenc++;
}
c[lenc]=x;
//去掉多余的0
while(c[lenc]==0 && lenc>1)
{
lenc--;
}
/*
//处理最高进位
if (c[lenc]==0)
lenc--;
*/
//输出结果
for (i=lenc;i>=1;i--)
cout<<c[i];
cout<<endl;
return 0;
}
/*
1.6编程基础之一维数组 10大整数加法(AC)-2022.08.11 运算符重载
http://noi.openjudge.cn/ch0106/10/
*/
#include <algorithm>
#include <iostream>
#include <cstring>
#include <sstream>
#include <cstdlib>
#include <string>
#include <cstdio>
#include <cctype>
#include <vector>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
using namespace std;
const int maxn=201;
struct bignumber
{
int len,s[maxn];
bignumber(){memset(s,0,sizeof(s));len=1;}
bignumber operator = (const char* num)
{
len=strlen(num);
for(int i=0;i<len;i++)s[i]=num[len-i-1]-'0';
return *this;
}
bignumber operator = (const int num)
{
char a[maxn];
sprintf(a,"%d",num);
*this=a;
return *this;
}
bignumber (const int num){*this=num;}
bignumber (const char* num){*this=num;}
bignumber operator+(const bignumber& a)
{
bignumber c;
c.len=max(len,a.len)+1;
for(int i=0,x=0;i<c.len;i++)
{
c.s[i]=s[i]+a.s[i]+x;
x=c.s[i]/10;
c.s[i]=c.s[i]%10;
}
while(c.s[c.len-1]==0&&c.len>1)c.len--;
return c;
}
bool operator < (const bignumber& x)const
{
if(len!=x.len)return len<x.len;
for(int i=len-1;i>=0;i--)if(s[i]!=x.s[i])return s[i]<x.s[i];
return false;
}
};
ostream& operator<<(ostream& out,const bignumber &x)
{
for(int i=x.len-1;i>=0;i--)cout<<x.s[i];
return out;
}
istream& operator>>(istream& in,bignumber &x)
{
char num[maxn];
in>>num;
x=num;
return in;
}
bignumber a,b;
int main()
{
ios::sync_with_stdio(false);
cin>>a>>b;
cout<<a+b<<endl;
return 0;
}
5、3445:【例78.3】回文数(Noip1999)
[例78.3] 回文数
1309:【例1.6】回文数(Noip1999)
洛谷——P1015 [NOIP1999 普及组] 回文数
1083 - 回文数
NOIP1999普及组_回文数_高精_普及减难度
CSP-J2-W1 P1015 [NOIP1999 普及组] 回文数
P1015 [NOIP1999 普及组] 回文数
/*
1309:【例1.6】回文数(Noip1999)-AC
http://ybt.ssoier.cn:8088/problem_show.php?pid=1309
*/
#include<iostream>
#include<cstring>
using namespace std;
int n,a[101],b[101],ans,i;
//将数串s转化为整数数组a
void init(int a[])
{
string s;
//n进制 读入字符串s
cin>>n>>s;
//数组a清0
memset(a,0,sizeof(a));
//用a[0]计算字符串s的位数
a[0]=s.length();
for(i=1;i<=a[0];i++)
if(s[a[0]-i]>='0'&&s[a[0]-i]<='9')
{
a[i]=s[a[0]-i]-'0';
}
else
{
a[i]=s[a[0]-i]-'A'+10;
}
}
//判别整数数组a是否为回文数
bool check(int a[])
{
for(i=1;i<=a[0];i++)
if(a[i]!=a[a[0]-i+1])
{
return false;
}
return true;
}
//整数数组a与其反序数b进行n进制加法运算
void jia(int a[])
{
for(int i=1;i<=a[0];i++)b[i]=a[a[0]-i+1]; //反序数b
for(int i=1;i<=a[0];i++) a[i]+=b[i]; //逐位相加
//处理进位
for(int i=1;i<=a[0];i++)
{
a[i+1]+=a[i]/n;
a[i]%=n;
}
//修正新的a的位数(a+b最多只能的一个进位)
//最高进位
if( a[a[0]+1]>0 ) a[0]++;
}
int main( void )
{
init(a);
if(check(a))
{
cout<<0<<endl;
return 0;
}
//步数初始化为0
ans=0;
while(ans++<=30)
{
jia(a);
if( check(a) )
{
cout<<ans<<endl;
return 0;
}
}
//输出无解信息
cout<<"Impossible";
return 0;
}
6、3446:练78.1 高精度乘法
练 78.1 高精度乘法
1307:【例1.3】高精度乘法
高精度乘法(信息学奥赛一本通-T1307)
高精度乘法(信息学奥赛一本通-T1307)
《信息学奥赛一本通》题解_1307_【例1.3】高精度乘法
/*
【例3】高精度乘法。输入两个正整数,求它们的积。
http://ybt.ssoier.cn:8088/problem_show.php?pid=1307
1.13编程基础之综合应用 09:大整数乘法
http://noi.openjudge.cn/ch0113/09/
10000的阶乘有多少位
https://zhidao.baidu.com/question/1436524189976524579.html
https://zhidao.baidu.com/question/694151540079539764.html
https://www.zybang.com/question/ca5656a12b448dcf825e5942badf98bc.html
https://blog.csdn.net/s8848/article/details/43602301/
10000!末尾有几个0?
https://www.zybang.com/question/422e4932aeca5e039da80a7c05e1e08b.html
高精度乘法的参考程序:
*/
#include<iostream>
#include<cstring>
#include<cstdio>
char a1[1001],b1[1001];
//string a,b,c;
int a[1001],b[1001],c[1001];
using namespace std;
int main( void )
{
int lena,lenb,lenc,i,j,x;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
cin>>a1>>b1;
//gets(a1);
//gets(b1);
lena=strlen(a1);
lenb=strlen(b1);
//123 321
for (i=0;i<=lena-1;i++)
{
a[lena-i]=a1[i]-48;
//a[lena-i]=a1[i]-'0';
}
for (i=0;i<=lenb-1;i++)
{
b[lenb-i]=b1[i]-48;//'0'
}
for (i=1;i<=lena;i++)
{
//用于存放进位
x=0;
//对乘数的每一位进行处理
for (j=1;j<=lenb;j++)
{
//当前乘积+上次乘积进位+原数
c[i+j-1]=a[i]*b[j]+x+c[i+j-1];
x=c[i+j-1]/10;
c[i+j-1]%=10;
}
//进位
c[i+lenb]=x;
}
lenc=lena+lenb;
//删除前导0
while (c[lenc]==0 && lenc>1)
{
lenc--;
}
for (i=lenc;i>=1;i--)
{
cout<<c[i];
}
//cout<<endl;
return 0;
}
7、3447:练78.2 大整数减法
练 78.2 大整数减法
1169:大整数减法
C++信息学奥赛OJ讲解:1169:大整数减法(NOI1.6.11)
信息学奥赛 1169-大整数减法
1169:大整数减法
1169:大整数减法
大整数减法(信息学奥赛一本通-T1169)
/*
1.6编程基础之一维数组 11 大整数减法 方法一
http://noi.openjudge.cn/ch0106/11/
1169:大整数减法
http://ybt.ssoier.cn:8088/problem_show.php?pid=1169
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
string a1,b1;
//char a1[300],b1[300];
int a[300],b[300],c[300],lena,lenb,lenc,i,x;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
cin>>a1>>b1;
//gets(a1);
//gets(b1); //输入加数与被加数
lena=a1.size();
lenb=b1.size();
for (i=0;i<=lena-1;i++) a[lena-i]=a1[i]-'0'; //加数放入a数组
for (i=0;i<=lenb-1;i++) b[lenb-i]=b1[i]-48; //加数放入b数组
i=1;
while (i<=lena||i<=lenb)
{
if (a[i]<b[i])
{
a[i]+=10; //不够减,那么向高位借1当10
a[i+1]--;
}
c[i]=a[i]-b[i]; //对应位相减
i++;
}
lenc=i;
while ((c[lenc]==0)&&(lenc>1)) lenc--; //最高位的0不输出
for (i=lenc;i>=1;i--) cout<<c[i]; //输出结果
cout<<endl;
return 0;
}
/*
NOI / 1.6编程基础之一维数组
11大整数减法 2021.11.28 AC
http://noi.openjudge.cn/ch0106/solution/31681163/
*/
#include <bits/stdc++.h>
#include <algorithm>
#include <string>
using namespace std;
int res[20000];
int ada[20000],adb[20000];
int to_Int(char a)
{
return a-'0';
}
int main()
{
string a,b;
int index=0;
cin>>a>>b;
int start=max(a.length(),b.length());
for(int i=a.length()-1,j=0;i>=0;--i,++j)ada[j]=to_Int(a[i]);
for(int i=b.length()-1,j=0;i>=0;--i,++j)adb[j]=to_Int(b[i]);
for(int i=0;i<start;++i,++index)
{
res[index]=ada[i]-adb[i];
if(res[index]<0)
{
int indexa=i;
res[index]+=10;indexa++;
ada[indexa]--;
while(ada[indexa]<0)
{
ada[indexa]+=10;
indexa++;
ada[indexa]--;
}
}
}
int i,flag=1;
for(i=index;res[i]==0;--i);
for(;i>=0;--i)
{
cout<<res[i];flag=0;
}
if(i<0&&flag)cout<<0;
return 0;
}
8、3450:【例81.1】 计算(a+b)/c的值
[例 81.1] 计算(a+b)/c 的值
1008:计算(a+b)/c的值
信息学奥赛一本通 第二章 1008 计算(a+b)/c的值
第二章 1008 计算(a+b)/c的值
第二章 1008 计算(a+b)/c的值_哔哩哔哩_bilibili
1008 计算(a+b)/c的值 信息学奥赛 1008 信息学奥赛一本通解题 第一部分C++语言基础部分_哔哩哔哩_bilibili
1008:计算(a+b)c的值
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,c;
cin>>a>>b>>c;
if( c==0)
{
cout<<"Division by zero condition"<<endl;
}
else
{
cout<<(a+b)/c;
}
return 0;
}
scratch3代码:
1、啊哈编程星球
适用于:编程初学者、小学一至三年级
2、慧通教育
适用于:编程初学者、小学生编程入门
3、《信息学奥赛一本通 编程启蒙》C++版
适用于:编程初学者、小学生编程启蒙
争取在小学1-4年级就将2、3两个题库的全部或大部分题 做完
为进一步深入学习信奥打好坚实的基础
4、信息学奥赛一本通
5、洛谷
洛谷题单广场
6、AcWing
7、编程魔法师