模拟思想:
在很难用递推,递归,枚举,回溯等算法时,可采用模拟策略。
技巧:
1,理解题意
2,组织逻辑
3,写函数,不要复制粘贴
4,步步验证,做一步运行一次!
大整数相加
字符串,存进数组。
import java.math.BigInteger;
//2021年3月20日上午1:59:29
//writer:apple
public class moni {
public static void main(String[] args) {
// TODO Auto-generated method stub
String a="1233231231245234525235235234";
String b="1234335655674856745967984759374";
int len=Math.max(a.length(), b.length());
int aa[]=new int[len];
int bb[]=new int[len];
int lenb=len;
for(int i=b.length()-1;i>=0;i--)
{
bb[--lenb]=b.charAt(i)-'0';
}
int lena=len;
for(int i=a.length()-1;i>=0;i--)
{
aa[--lena]=a.charAt(i)-'0';
}
int ans[]=new int[len];
int t=0;
for(int i=len-1;i>=0;i--)
{
ans[i]=(aa[i]+bb[i]+t)%10;
t=(aa[i]+bb[i]+t)/10;
}
if(t==0)
{
for(int i:ans)
{
System.out.print(i);
}
}
else {
System.out.print(t);
for(int i:ans)
System.out.print(i);
}
}
}
暴力策略
离线算法:
对于t次询问,每次询问之间独立,可以用空间换时间的算法。
public class baoli {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int t=scanner.nextInt();
int modd=(int) (1e9+7);
int a[]=new int[100005];
int ans[]=new int[1000000005];
for(int i=1;i<=t;i++)
{
int n=scanner.nextInt();
a[i]=n;
}
int tmp=1;
for(int i=1;i<=100000000;i++)
{
tmp=tmp*i;
ans[i]=ans[i-1]+tmp;
}
for(int i=1;i<=t;i++)
{
System.out.println(ans[a[i]]);
}
}
}
贪心策略
一般用于求解最优问题。
不一定正确。
局部最优解为全局最优解时,贪心一定正确
分治策略
分而治之
较大规模问题分解成几个较小规模问题。
分治算法:快速排序 快速幂 二分查找
二分:
找到大于k的第一个数字。
int a[]= {0,2,3,4,5,6,7,3,2,3,5};
int key=3;
Arrays.sort(a);
int l=0;int r=a.length-1;
while(l<r)
{
int mid=(l+r)/2;
if(a[mid]>key)
{
r=mid-1;
}
else {
l=mid+1;
}
}
for(int i:a)
System.out.print(i+" ");
System.out.println(l);//下标为l