枯木逢春不在茂,年少且惜镜边人
本周准备做一些题,顺便学习一些算法
1.
#include<stdio.h>
int main()
{
int i,j,m=0,t;
for(i=1;i<=2019;i++)
{
t=i;
while(t!=0)
{
j=t%10;
t=t/10;
if(j==9)
{
m++;
break;
}
}
}
printf("%d",m);
return 0;
}
2.测试单词是辅音 元音 辅音 元音的顺序
#include<stdio.h>
int main()
{
char a[100];
int b[5];
int i,j,m=1;
gets(a);
if(a[0]=='a'||a[0]=='e'||a[0]=='i'||a[0]=='o'||a[0]=='u')
{
printf("no");
return 0;
}
else
{
b[m]=1;
m++;
}
for(i=1;a[i]!='\0';i++)
{
if(a[i]=='a'||a[i]=='e'||a[i]=='i'||a[i]=='o'||a[i]=='u')
{
b[m]=2;
if(b[m-1]==2)
{
m--;
}
m++;
}
else
{
b[m]=1;
if(b[m-1]==1)
{
m--;
}
m++;
}
}
if(b[1]==1&&b[2]==2&&b[3]==1&&b[4]==2&&m==5)
{
printf("yes");
}
else
printf("no");
return 0;
}
#include<stdio.h>
int b[10010];
int main()
{
int n,i,j,k;
int a[10010];
int m=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n-2;i++)
for(j=i+1;j<n-1;j++)
for(k=j+1;k<n;k++)
{
if(a[i]<a[j]&&a[j]<a[k])
{
if(b[j]==0)
{
m++;
b[j]=1;
}
}
}
printf("%d",m);
return 0;
}
#include<stdio.h>
int main()
{
long long t,n,x;
int i,j,m=0,flag=0;
scanf("%lld",&n);
for(t=1;t<=n;t++)
{
x=t;
while(x!=0)
{
i=x%10;
x=x/10;
j=x%10;
if(j<=i)
{
flag=1;
}
else
{
flag=0;
break;
}
}
if(flag==1)
m++;
}
printf("%d",m);
return 0;
}
#include<stdio.h>
int book[21][21],n,m,t,l=0;
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
struct f
{
int x;
int y;
int t;
};
int main()
{
char a[21][21];
struct f que[10000];
int i,j,k,flag=0,tx,ty;
int r,head=1,tail=1;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
scanf("%s",a[i]);
for(i=1;i<=n;i++)
for(j=0;j<m;j++)
{
if(a[i][j]=='g')
{
que[tail].x=i;
que[tail].y=j;
que[tail].t=0;
tail++;
}
}
scanf("%d",&r);
while(head<tail)
{
for(k=0;k<4;k++)
{
tx=que[head].x+next[k][0];
ty=que[head].y+next[k][1];
if(tx<1||tx>n||ty<0||ty>=m)
continue;
if(a[tx][ty]=='.')
{
que[tail].x=tx;
que[tail].y=ty;
que[tail].t=que[head].t+1;
a[tx][ty]='g';
tail++;
printf("(%d,%d)\n",tx,ty);
}
if(que[tail-1].t==r+1)
{
a[tx][ty]='.';
flag=1;
break;
}
}
if(flag==1)
break;
head++;
}
for(i=1;i<=n;i++)
printf("%s\n",a[i]);
}
#include<stdio.h>
int a[100];
int book[100];
int b[100];
int m,n;
int max=0;
void dfs(int x,int sum,int p)
{
int i,j;
if(x==m)
{
if(sum>max)
{
max=sum;
}
return ;
}
for(i=p;i<n;i++)
{
if(book[i]==0)
{
book[i]=1;
dfs(x+1,sum+a[i],i+1);
book[i]=0;
}
}
return ;
}
int main()
{
int i,j;
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
dfs(0,0,0);
printf("%d",max);
return 0;
}
原来是想dfs 求出最大和 然后 输出路径,这样直接就得到了,回头一想
就是寻找一个数组里m个最大的数,且按照原始的顺序输出,和大佬讨论
会不会是贪心,或者dp?
牛逼
下面看下解法
#include<stdio.h>
int cmp(const void *a, const void *b)
{
return *(int *)b - *(int *)a;
}
int cnp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
int b[100];
int a[100];
int t[100];
int main()
{
int i,j;
int n,m;
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
qsort(b,n,sizeof(b[0]),cmp);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(b[i]==a[j])
{
t[i]=j;
}
}
qsort(t,m,sizeof(t[0]),cnp);
for(i=0;i<m;i++)
printf("%d ",a[t[i]]);
}
qsort(b,n,sizeof(b[0]),cmp);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(b[i]==a[j])
{
t[i]=j;
}
}
qsort(t,m,sizeof(t[0]),cnp);
感觉上面这部分是学到的东西
#include<stdio.h>
#include<math.h>
int ans;
void dfs(int a,int b)
{
int i;
int x;
x=abs(a-b);
ans++;
if(ans>10000)
{
ans%=10000;
}
for(i=1;i<x;i++)
dfs(b,i);
return ;
}
int main()
{
int n;
int i;
scanf("%d",&n);
for(i=1;i<=n;i++)
dfs(n,i);
printf("%d",ans);
return 0;
}
下面这个是用动态规划做的
#include<stdio.h>
#include<math.h>
int ans;
int pdd(int a,int b)
{
int i;
int x=1;
for(i=1;i<abs(a-b);i++)
{
x+=pdd(b,i);
}
return x;
}
int main()
{
int i;
int n;
scanf("%d",&n);
for(i=1;i<=n;i++)
ans=ans+pdd(n,i);
printf("%d",ans%10000);
return 0;
}
感觉这也是一个递归
递推关系:dp[i][j] = dp[j][1] + … + dp[j][abs(i-j)-1] + 1
按这个来想其实除了dp[i][j]其余都是dp都是1,所以用x=1啦替换