过河卒
分析:简单递推题。注意答案要longlong
#include<iostream> #include<algorithm> using namespace std; int dx[10]={0,-1,-1,1,1,2,2,-2,-2},dy[10]={0,2,-2,2,-2,1,-1,1,-1}; bool book[25][25]; long long f[25][25]; int main(){ int n,m,x,y; cin>>n>>m>>x>>y; book[x][y]=1; for(int i=1;i<=8;++i){ int xx=x+dx[i],yy=y+dy[i]; if(xx<0||xx>n||yy<0||yy>m)continue; book[xx][yy]=1; } f[0][0]=1; for(int i=0;i<=n;++i){ for(int j=0;j<=m;++j){ if(book[i][j])continue; if(i==0&&j==0)continue; if(i!=0&&j!=0) f[i][j]=f[i-1][j]+f[i][j-1]; else if(i==0) f[i][j]=f[i][j-1]; else f[i][j]=f[i-1][j]; } } cout<<f[n][m]; return 0; }
级数求和
分析:水题。
#include<iostream> using namespace std; int main() { int k,i; long double sum; cin>>k; sum=0;i=0; while(sum<=k) { i=i+1; sum=sum+(1.0/i); } cout<<i<<endl; return 0; }
选数
分析:dfs简单题
#include<cstdio> int n,k,ans; int a[22]; int is_prime(int n){ if(n == 1 || n == 0)return 0; if(n == 2)return 1; for(int i = 2; i*i <= n; i++) if(n % i == 0)return 0; return 1; } void dfs(int pos,int pps,int sum){ if(!pos) { ans +=is_prime(sum);return ;} for(pps; pps <= n; pps++)dfs(pos -1,pps +1, sum + a[pps]); } int main(){ scanf("%d%d", &n,&k); for(int i = 1; i <= n; i++)scanf("%d", &a[i]); dfs(k,1, 0); printf("%d\n", ans); return 0; }
产生数
分析:floyd+乘法原理(高精)
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int cng[10][11],num[10]; //cng[i][j]代表数字i的第j种变法是什么,num[i]代表数字i有多少变法 (这里没包括它自己) int n[35],ans[31];//ans最大是10的30次方 bool find(int x,int y){//找数字x是否已经有y这种变法 for(int i=1;i<=num[x];i++) if(cng[x][i]==y) return 1; if(x==y) return 1;//已经有或者是其本身返回1 return 0; } int main(){ int k,a,b,len=0; char x; while(scanf("%c",&x)&&x!=‘ ‘) n[++len]=x-48; cin>>k; for(int i=1;i<=k;i++){ scanf("%d%d",&a,&b); cng[a][++num[a]]=b; } //对i的一种变法找它有的变法,如果不存在在i的变法中,则加上它,num[i]+1; for(int i=0;i<=9;i++) for(int j=1;j<=num[i];j++) for(int k=1;k<=num[cng[i][j]];k++) if(!find(i,cng[cng[i][j]][k])) cng[i][++num[i]]=cng[cng[i][j]][k]; //下面是高精 ans[0]=1; for(int i=1;i<=len;i++){//对于每一个数字,乘它的变法数 int d=n[i],p=0; if(num[d]){ for(int i=0;i<=31;i++){ ans[i]=ans[i]*(num[d]+1)+p; p=ans[i]/10; ans[i]%=10; } } } bool ok=0; for(int i=31;i>=0;i--) if(ans[i]||ok){ ok=1; cout<<ans[i]; } return 0; }
总结:noip2002除了最后一题以外,其他都是大水题。。。
时间: 2024-10-28 09:36:55