ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2022/6/23随笔

2022-06-23 23:37:53  阅读:154  来源: 互联网

标签:10 include string num2 23 int 2022 随笔 num1


最近在读洛谷的《深入浅出程序设计竞赛(基础篇)》,对于刷题量比较少,代码习惯不太规范的我来说意外的合适,预计用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 }

 

标签:10,include,string,num2,23,int,2022,随笔,num1
来源: https://www.cnblogs.com/inawaken/p/16407178.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有