欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

class10 mfy 算法一

时间:2024-06-23 17:35 作者:admin 点击:
模拟算法 按照题目要求一步一步写 枚举算法 又叫做暴力搜索算法 1、列举所有可能性 2、通过条件筛除正确答案 福尔摩斯密码 ABCDE*X=EDCBA ABCDEX各是多少? for(int a=1;a10;a++) for(int b=0;b10

模拟算法

按照题目要求一步一步写


枚举算法

又叫做暴力搜索算法

1、列举所有可能性

2、通过条件筛除正确答案


福尔摩斯密码

ABCDE*X=EDCBA

ABCDEX各是多少?

for(int a=1;a<10;a++)

for(int b=0;b<10;b++)

for(int c=0;c<10;c++)

for(int d=0;d<10;d++)

for(int e=1;e<10;e++)

for(int x=2;x<10;x++){

   if(互不相同){

       int num=---;

       int num2=---;

       if(num*x==num2){

           cout<<---;

       }

   }

}


枚举算法限制:

可能性过多->超时

可能性列不出来(小数)

条件表达不出来


枚举算法例题:

选手猜想:

A说:E是第一名

B说:我是第二名

C说:A肯定垫底

D说:C肯定拿不了第一名

E说:D应该是第一名

比赛结果:

E不是第二也不是第三,且只有第一和第二名猜对了

求他们的排名

for(int a=1;a<6;a++)

for(int b=1;b<6;b++)

for(int c=1;c<6;c++)

for(int d=1;d<6;d++)

for(int e=1;e<6;e++){

   if(互不相同){

       if(e不是2不是3){

           bool as=e==1;

           bool bs=b==2;

           bool cs=a==5;

           bool ds=c!=1;

           bool es=d==1;

           if(as+bs+cs+ds+es==2){

               if(a*b==2&&as+bs==2||

                   a*c==2&&as+cs==2||

                   a*d==2&&as+ds==2||...

               )

               cout<<---;

           }

       }

   }

}


快速幂

将a^b降幂处理,降低循环次数

通常求 a^b mod m 的结果

long long ksm(long long a,long long b,long long m){

   long long ans=1;

   while(b){

       if(b%2==1){

           ans*=a;

           ans%=m;

       }

       b/=2;

       a=a*a;

       a%=m;

   }

   return ans;

}


普及组算法:模拟、枚举、贪心(没讲)、递推、递归、二分(没讲)、倍增


高精度算法:加减乘除

核心思想:模拟小学数学列竖式


输入两个大整数(长度很长),输出他们的和

222222222222222222222

1111111

求和

222222222222223333333


解决策略:

   存数据:string

   对齐:倒序

   计算:转类型,进位,保存

   输出结果:倒序,去除前导零

string addll(string a,string b){

   int la=a.size(),lb=b.size();

   reverse(a.begin(),a.end());

   reverse(b.begin(),b.end());

   int n1[1000]={},n2[1000]={},n3[1000]={};

   for(int i=0;i<la;i++) n1[i]=a[i]-48;

   for(int i=0;i<lb;i++) n2[i]=b[i]-48;

   int jw=0;

   for(int i=0;i<=max(la,lb);i++){

       int num=jw+n1[i]+n2[i];

       n3[i]=num%10;

       jw=num/10;

   }

   int i=max(la,lb)+50;

   while(n3[i]==0&&i>0) i--;

   string ans="";

   for(;i>=0;i--){

       ans+=(char)(n3[i]+48);

   }

   return ans;

}

string subll(string a,string b){}

(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%