2022/6/23随笔
最近在读洛谷的《深入浅出程序设计竞赛(基础篇)》,对于刷题量比较少,代码习惯不太规范的我来说意外的合适,预计用25天左右的时间刷完这本书上的题目(算法相关)
今天A了七题,从下午3点到晚上10点(当然中途划水了3个小时),被高精度阶乘相加卡了1个钟头,其实思路一开始就明确,忽略了某个基础点,卡进去了
P1042 [NOIP2003 普及组] 乒乓球
P1042 [NOIP2003 普及组] 乒乓球 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
//简单的模拟题,我认为可以学习的点是
//用一个数组把两种情况记录下来,方便调用,多种情况也一样,不必再进行大体重复的代码编写
//用一个数组记录输赢情况,赢1,输0,我方加输赢情况,敌方+1-输赢情况
//题不难,但思想很好
//还有就是数据范围,看清楚
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=25*2500+10; 5 int f[10]={11,21}; 6 int a[maxn]; 7 int main() 8 { 9 int n=0; 10 char t; 11 while(1) 12 { 13 cin>>t; 14 if(t=='E') 15 break; 16 else if(t=='W') a[n++]=1; 17 else if(t=='L') a[n++]=0; 18 } 19 for(int k=0;k<2;k++) 20 { 21 int w=0; 22 int l=0; 23 for(int i=0;i<n;i++) 24 { 25 w+=a[i]; 26 l=l+1-a[i]; 27 if(max(w,l)>=f[k]&&abs(w-l)>=2) 28 { 29 cout<<w<<":"<<l<<endl; 30 w=l=0; 31 } 32 } 33 cout<<w<<":"<<l<<endl; 34 cout<<endl; 35 } 36 return 0; 37 }
//P2670 [NOIP2015 普及组] 扫雷游戏
P2670 [NOIP2015 普及组] 扫雷游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
//用数组记录坐标,进行判断,清晰明了
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=105; 5 int dx[10]={-1,-1,-1,0,0,1,1,1}; 6 int dy[10]={-1,0,1,-1,1,-1,0,1}; 7 int n,m; 8 char a[maxn][maxn]; 9 int main() 10 { 11 cin>>n>>m; 12 for(int i=0;i<n;i++) 13 { 14 for(int j=0;j<m;j++) 15 { 16 cin>>a[i][j]; 17 } 18 } 19 for(int i=0;i<n;i++) 20 { 21 for(int j=0;j<m;j++) 22 { 23 int cnt=0; 24 if(a[i][j]=='*') 25 { 26 cout<<"*"; 27 } 28 else 29 { 30 for(int k=0;k<8;k++) 31 { 32 if(a[i+dx[k]][j+dy[k]]=='*') 33 cnt++; 34 } 35 cout<<cnt; 36 } 37 cnt=0; 38 } 39 cout<<endl; 40 } 41 return 0; 42 }
//P1563 [NOIP2016 提高组] 玩具谜题
P1563 [NOIP2016 提高组] 玩具谜题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
//重要的是读题,把逻辑关系理清,理解题意花了将近15分钟,如果是英文题,我直接寄了
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=1e5+10; 5 struct node 6 { 7 int f; 8 string str1; 9 }a[maxn]; 10 int b[maxn][2]; 11 int n,m; 12 int main() 13 { 14 cin>>n>>m; 15 for(int i=0;i<n;i++) 16 { 17 cin>>a[i].f>>a[i].str1; 18 } 19 for(int j=0;j<m;j++) 20 { 21 cin>>b[j][0]; 22 cin>>b[j][1]; 23 } 24 int y=0; 25 for(int x=0;x<m;x++) 26 { 27 if(b[x][0]==0&&a[y].f==0) 28 { 29 y=(y+n-b[x][1])%n; 30 } 31 else 32 if(b[x][0]==0&&a[y].f==1) 33 { 34 y=(y+b[x][1])%n; 35 } 36 else 37 if(b[x][0]==1&&a[y].f==0) 38 { 39 y=(y+b[x][1])%n; 40 } 41 else 42 if(b[x][0]==1&&a[y].f==1) 43 { 44 y=(y+n-b[x][1])%n; 45 } 46 } 47 cout<<a[y].str1<<endl; 48 return 0; 49 }
//P1601 A+B Problem(高精)
P1601 A+B Problem(高精) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
//高精度加,背板就可以了
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 string a; 5 string b; 6 void initial() 7 { 8 while(a.size()<b.size()) a='0'+a; 9 while(b.size()<a.size()) b='0'+b; 10 } 11 void findmax() 12 { 13 if(a<b) 14 { 15 swap(a,b); 16 } 17 } 18 bool del() 19 { 20 if(a[0]=='0') 21 { 22 a.erase(0,1); 23 return true; 24 } 25 else 26 return false; 27 } 28 void alldel() 29 { 30 while(del()) 31 { 32 del(); 33 } 34 } 35 int main() 36 { 37 cin>>a>>b; 38 initial(); 39 a='0'+a; 40 b='0'+b; 41 for(int i=a.size()-1;i>=0;i--) 42 { 43 int num1=a[i]-'0'; 44 int num2=b[i]-'0'; 45 if(num1+num2>9) 46 { 47 a[i-1]=a[i-1]-'0'+1+'0'; 48 a[i]=(num1+num2)%10+'0'; 49 } 50 else 51 { 52 a[i]=num1+num2+'0'; 53 } 54 } 55 del(); 56 cout<<a<<endl; 57 return 0; 58 }
//P1303 A*B Problem
P1601 A+B Problem(高精) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
//高精度乘,背板
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 void initial(string &a,string &b) 5 { 6 while(a.size()<b.size()) a='0'+a; 7 while(b.size()<a.size()) b='0'+b; 8 } 9 void findmax(string &a,string &b) 10 { 11 string cmp; 12 if(a<b) 13 { 14 swap(a,b); 15 } 16 } 17 bool del(string &a) 18 { 19 if(a[0]=='0') 20 { 21 a.erase(0,1); 22 return true; 23 } 24 else 25 { 26 return false; 27 } 28 } 29 void alldel(string &a) 30 { 31 while(del(a)) 32 { 33 del(a); 34 } 35 } 36 string bigadd(string &a,string &b) 37 { 38 initial(a,b); 39 a='0'+a; 40 b='0'+b; 41 for(int i=a.size()-1;i>=0;i--) 42 { 43 int num1=a[i]-'0'; 44 int num2=b[i]-'0'; 45 if(num1+num2>9) 46 { 47 a[i-1]=a[i-1]-'0'+1+'0'; 48 a[i]=(num1+num2)%10+'0'; 49 } 50 else 51 { 52 a[i]=num1+num2+'0'; 53 } 54 } 55 del(a); 56 return a; 57 } 58 int main() 59 { 60 string a,b; 61 string r="0"; 62 cin>>a>>b; 63 alldel(a); 64 alldel(b); 65 if(a==""||b=="") 66 cout<<"0"<<endl; 67 else 68 { 69 initial(a,b); 70 findmax(a,b); 71 alldel(b); 72 for(int i=b.size()-1;i>=0;i--) 73 { 74 int num=b[i]-'0'; 75 if(i!=b.size()-1) 76 { 77 a=a+'0'; 78 } 79 for(int j=1;j<=num;j++) 80 { 81 r=bigadd(r,a); 82 } 83 } 84 alldel(r); 85 cout<<r<<endl; 86 } 87 return 0; 88 }
//顺便写个大数除法(不考虑小数位)
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 void initial(string &a,string &b) 5 { 6 while(a.size()<b.size()) a='0'+a; 7 while(b.size()<a.size()) b='0'+b; 8 } 9 void findmax(string &a,string &b) 10 { 11 if(a<b) 12 { 13 swap(a,b); 14 } 15 } 16 bool del(string &a) 17 { 18 if(a[0]=='0') 19 { 20 a.erase(0,1); 21 return true; 22 } 23 else 24 { 25 return false; 26 } 27 } 28 void alldel(string &a) 29 { 30 while(del(a)) 31 { 32 del(a); 33 } 34 } 35 string bigadd(string a,string b) 36 { 37 initial(a,b); 38 a='0'+a; 39 b='0'+b; 40 for(int i=a.size()-1;i>=0;i--) 41 { 42 int num1=a[i]-'0'; 43 int num2=b[i]-'0'; 44 if(num1+num2>9) 45 { 46 a[i-1]=a[i-1]-'0'+1+'0'; 47 a[i]=num1+num2-10+'0'; 48 } 49 else 50 { 51 a[i]=num1+num2+'0'; 52 } 53 } 54 alldel(a); 55 return a; 56 } 57 string bigsub(string a,string b) 58 { 59 initial(a,b); 60 findmax(a,b); 61 for(int i=a.size()-1;i>=0;i--) 62 { 63 int num1=a[i]-'0'; 64 int num2=b[i]-'0'; 65 if(num1-num2<0) 66 { 67 a[i-1]=a[i-1]-'0'-1+'0'; 68 a[i]=num1-num2+10+'0'; 69 } 70 else 71 { 72 a[i]=num1-num2+'0'; 73 } 74 } 75 alldel(a); 76 return a; 77 } 78 int main() 79 { 80 string a,b; 81 cin>>a>>b; 82 string tmp;//比较变量,b乘以倍数 83 string res="0";//记录答案 84 string restmp="1";//记录倍数 85 initial(a,b); 86 findmax(a,b); 87 tmp=b; 88 for(int i=1;i<=(a.size()-b.size());i++) 89 { 90 tmp=tmp+'0'; 91 restmp=restmp+'0'; 92 } 93 while(a>=b) 94 { 95 initial(a,b); 96 initial(a,tmp); 97 if(a>=tmp) 98 { 99 a=bigsub(a,tmp); 100 res=bigadd(res,restmp); 101 } 102 else 103 { 104 tmp.erase(tmp.size()-1); 105 restmp.erase(restmp.size()-1); 106 if(a>=tmp) 107 { 108 a=bigsub(a,tmp); 109 res=bigadd(res,restmp); 110 } 111 } 112 initial(a,b); 113 } 114 alldel(res); 115 cout<<res<<endl; 116 return 0; 117 }
//P1009 [NOIP1998 普及组] 阶乘之和
P1009 [NOIP1998 普及组] 阶乘之和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
//高精度的实质就是按位计算,使用字符串纯粹是为了对齐数据和方便去0
//产生不对齐,有多余0的原因是顺序存储,即首位是最高位
//若存储结构为逆序,末位是最高位,则可以采用更容易处理的整形数组进行高精度运算
// if(b[len]!=0)
// len++;
//不能使用上述语句来判断进位
//1.可能不止进位一位
//2.可能中途进位有0
//若用字符串型可能解决问题
// while(b[len]!='\0')
// len++;
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int main() 5 { 6 int i,a[1005]={0},b[1005]={0},n,j; 7 cin>>n; 8 a[0]=b[0]=1; 9 for(i=2;i<=n;i++) 10 { 11 for(j=0;j<100;j++) 12 b[j]*=i; 13 for(j=0;j<100;j++) 14 { 15 if(b[j]>9) 16 { 17 b[j+1]+=b[j]/10; 18 b[j]%=10; 19 } 20 } 21 for(j=0;j<100;j++) 22 { 23 a[j]+=b[j]; 24 if(a[j]>9) 25 { 26 a[j+1]+=a[j]/10; 27 a[j]%=10; 28 } 29 } 30 } 31 for(i=100;i>=0&&a[i]==0;i--); 32 for(j=i;j>=0;j--) 33 cout<<a[j]; 34 return 0; 35 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律