2021-02-01

第一周算法训练
只写出来14道题,有一道思维题想来想去还错了哈哈哈
A.查成绩
题目链接:https://vjudge.net/problem/%E8%AE%A1%E8%92%9C%E5%AE%A2-131
根据读入的find,insert,end来判断需要进行的操作
代码:

#include
#include
struct student
{
     
	char name[20];
	int score;
};
int main()
{
     
	struct student stu[200];
	char str[10];
	char name0[20];
	int i=0;
	int j;
	int a[200];
	int k=0;
	int q;
	for(q=0;q<1000000;q++)		
	{
     
		scanf("%s",str);
		if(str[0]=='e')
		break;
		else if(str[0]=='i') 
		{
     
			scanf("%s %d",stu[i].name,&stu[i].score);
			i++;
			
		}
		else if(str[0]=='f')
		{
     
			int F=0;
			scanf("%s",name0);
			for(j=0;j<i;j++)
			{
     
				if(strcmp(name0,stu[j].name)==0)
				{
     
					a[k]=stu[j].score;
					F=1;
					break;
				}
				if(F==0) a[k]=-1;
				
			}
			k++;
		}
	
	}
	
	for(i=0;i<k;i++)
	{
     
		printf("%d\n",a[i]);
		
	}
	
	return 0;
 } 

D.回文数猜想
题目链接:
https://vjudge.net/problem/HDU-1282
写了一个函数来把数倒过来,很方便,题目不难,注意输出格式问题,用二维数组来储存变换的数字过程。
代码:

#include
#include
int reverse(int x)//将数倒过来 
{
     
	int a[100];
	int i=0;
	int j,y=0;
	while(x)
	{
     
		a[i]=x%10;
		x/=10;
		i++;
	}
	for(j=0;j<i;j++)
	{
     
		y+=a[j]*pow(10,i-j-1);
	}
	return y;
	
}
int main()
{
     
	int a,b;
	
	int times[10000]={
     0};//记录变换了几次 
	int count=0;//用来记录几个数 
    int group[100][1000];
	int i,j;
	
	while(scanf("%d",&group[count][times[count]])!=EOF)
	{
     
		a=group[count][times[count]]; 
		while(a!=reverse(a))
		{
     
			times[count]++;//变换一次
			group[count][times[count]]=a=a+reverse(a); 
			
		}
		
	
		
		count++;
	}
	//printf("count=%d\n",count);
	for(i=0;i<count;i++)
	{
     
		printf("%d\n",times[i]);
		for(j=0;j<=times[i];j++)
		{
     
			printf("%d",group[i][j]);
			if(j<times[i])
			printf("--->");
			else
			printf("\n");
		}
	}
	
	return 0;
}

F.买鸡问题
题目链接:
https://vjudge.net/problem/%E8%AE%A1%E8%92%9C%E5%AE%A2-T1372
套娃就可啦,注意还有no answer

#include
int main()
{
     
	int a,b,c;//公鸡母鸡小鸡数量
	int i,j,k;//循环变量
	int n;
	int count=0;
	scanf("%d",&n);
	for(i=0;i<=n/5;i++)
	{
     
		for(j=0;j<=n/2;j++)
		{
     
			for(k=0;k<=3*n;k+=3)
			{
     
				if((5*i+3*j+k/3==n)&&(i+j+k==n))
				{
     
			
				printf("%d %d %d\n",i,j,k);
			    count=1;
				}
			}
		}
	 } 
	 if(count==0)
	 printf("No Answer.");
	 return 0;
}

H.最小新整数
题目链接:
https://vjudge.net/problem/%E8%AE%A1%E8%92%9C%E5%AE%A2-T1258
要从前开始删去较大的数字,使这个数字尽量呈递增,这样的新整数才会最小。
代码:

#include
#include
int main()
{
     
	int n;//n组数据
	char s[20];//用来存一串数字 
	int  k;//删去的位数 
	int len ,i,j;
	scanf("%d\n",&n);
	int p=0;
	char result[100][20];
	int l[100];
	int q=n;
	while(n--)
	{
     
		scanf("%s %d",s,&k);
		len=strlen(s);
		int b;
		b=len;
		int a;
		//,从前面位数大的开始删,如果前面一位比后面一位的大,就删去 ,一共删去k位,即进行k次操作 
		for(i=0;i<k;i++)
		
		{
      
		    for(j=0;j<len-1;j++)
		    {
     
		    	if(s[j]>s[j+1])
		    	{
     
		    		for(a=j;a<len-1;a++)
		    		{
      
		    	    	s[a]=s[a+1];
		    		} 
		    		len--;//删除一次,s少一位 
					break;//往前覆盖,再进行下一次删除 
					
				}
			}
		} 
		l[p]=b-k;
		/*printf("l[%d]=%d\n",p,l[p]);
		for(i=0;i
		for(i=0;i<l[p];i++)
		{
     
			result[p][i]=s[i];
		//	printf("result[%d][%d]=%c\n",p,i,result[p][i]);
		}
		p++;
	}
	for(i=0;i<q;i++)
	
	{
     
		for(j=0;j<l[i];j++)
		{
     
			printf("%c",result[i][j]);
		}
		printf("\n");
	}
	return 0;
 } 

I赶时间
题目链接:
https://vjudge.net/problem/%E8%AE%A1%E8%92%9C%E5%AE%A2-T1321
把时间都化成秒去计算就可以了

#include
int main()
{
     
	char s1[20],s2[20];
	int a1,a2;
	scanf("%s %s",s1,s2);
	a1=((s1[0]-'0')*10+(s1[1]-'0'))*3600+((s1[3]-'0')*10+(s1[4]-'0'))*60+(s1[6]-'0')*10+(s1[7]-'0');
	a2=((s2[0]-'0')*10+(s2[1]-'0'))*3600+((s2[3]-'0')*10+(s2[4]-'0'))*60+(s2[6]-'0')*10+(s2[7]-'0');
	printf("%d",a1-a2);
	return 0;
}

J暖气坏了
题目链接:
https://vjudge.net/problem/%E8%AE%A1%E8%92%9C%E5%AE%A2-T1703#include

每次只需判断前后重复的部分即可,减去重复部分再求和

int main()
{
     
	char s1[20],s2[20];
	int a1,a2;
	scanf("%s %s",s1,s2);
	a1=((s1[0]-'0')*10+(s1[1]-'0'))*3600+((s1[3]-'0')*10+(s1[4]-'0'))*60+(s1[6]-'0')*10+(s1[7]-'0');
	a2=((s2[0]-'0')*10+(s2[1]-'0'))*3600+((s2[3]-'0')*10+(s2[4]-'0'))*60+(s2[6]-'0')*10+(s2[7]-'0');
	printf("%d",a1-a2);
	return 0;
}

L.n对数的排列问题
题目链接:
https://vjudge.net/problem/HDU-2554
找规律,当n是4的倍数或者3*n-1是4的倍数即可。
找规律过程:

代码:

#include 
int main()
{
     
	
	int n;
	int i=0;
	int l;
	char s[1000000];
	for(l=0;l<1000000;l++)
	{
     
	    scanf("%d",&n);
	    if(n==0) break;
		if((n%4==0)||((n*3-1)%4==0))
		s[i]='Y';
		else s[i]='N';
		i++;
	
	}

	int j;
	for(j=0;j<i;j++)
	{
     

		printf("%c\n",s[j]);
	
	
    }
	
	return 0;
}

M。母牛的故事
题目链接:
https://vjudge.net/problem/%E8%AE%A1%E8%92%9C%E5%AE%A2-T1904
其实就是斐波那契问题,这一年的牛的数目等于前一年加上出生的,而三年前的以及以前的牛长到今年刚好能生小牛,即
F(n)=F(n-1)+F(n-3)
代码:

#include
int main()
{
     
	int i;
	int n;
	scanf("%d",&n);
	int a[60]={
     0};
	a[1]=1;
	a[2]=2;
	a[3]=3;
	for(i=4;i<=n;i++)
	{
     
		a[i]=a[i-1]+a[i-3];
	}
	printf("%d",a[n]);
	return 0;
}

N.无限的路
题目链接:
https://vjudge.net/problem/HDU-2073
算出坐标距离原点的距离,再取差的绝对值即可
代码:

#include
#include
double sum(int x,int y)
{
     
	int i;
	int s;
    double a[200];
    double f=0,l=0;
    s=x+y;
    for(i=1;i<=s;i++)
    {
     
    	a[i]=sqrt((i-1)*(i-1)+i*i);
    	f+=a[i];
	}
	for(i=1;i<s;i++)
	{
     
		l+=i;
	}
	f=f+sqrt(2)*(l+x);
	return f;
}
int main()
{
     
	int n;//n组数据
	int x1,x2,y1,y2;//坐标
	int i,j; 
	double result[100];
	double sum1,sum2;
	scanf("%d\n",&n);
	for(i=0;i<n;i++)
	{
     
		scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
		sum1=sum(x1,y1);
		sum2=sum(x2,y2);
		result[i]=fabs(sum1-sum2);
		//printf("sum1=%f sum2=%f\n",sum1,sum2);
	 } 
	 for(i=0;i<n;i++)
	 {
     
	 	printf("%.3f\n",result[i]);
	 }
	 
	 return 0;
}

O.统计元音
题目链接:
https://vjudge.net/problem/HDU-2027
注意输出格式!!!
代码:

#include
#include
struct each
{
     
	int num[5];
	char s[200];
};
int main()
{
     
	int n,i,j,len;
	
	scanf("%d\n",&n);
	struct each a[200];
	int k=n;
	for(i=0;i<n;i++) 
	{
     
		gets(a[i].s);
		len=strlen(a[i].s);
		
		a[i].num[0]=0;
		a[i].num[1]=0;
		a[i].num[2]=0;
		a[i].num[3]=0;
		a[i].num[4]=0;
	
		for(j=0;j<len;j++)
		{
     
			if(a[i].s[j]=='a')
			a[i].num[0]++;
			else if(a[i].s[j]=='e')
			a[i].num[1]++;
			else if(a[i].s[j]=='i')
			a[i].num[2]++;
			else if(a[i].s[j]=='o')
			a[i].num[3]++;
			else if(a[i].s[j]=='u')
			a[i].num[4]++;
				
		}
	
	}
	    if(k>0)
    {
      
		for(i=0;i<k;i++)
		{
     
			printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d",a[i].num[0],a[i].num[1],a[i].num[2],a[i].num[3],a[i].num[4]);
			if(i<k-1)
			printf("\n\n");
			else printf("\n");
		}

	} 
	return 0;
}

P求数列的和
题目链接:
https://vjudge.net/problem/HDU-2009
代码:

#include
#include
int main()
{
     
	double a[1000];
	int b;
	int i;
	double sum[10000];
	int k=0;
	
	while((scanf("%lf %d",&a[0],&b))!=EOF)
	{
     
		sum[k]=a[0];
		for(i=1;i<b;i++)
		{
     
			a[i]=sqrt(a[i-1]);
			sum[k]+=a[i];
		}
		k++;
	}
	for(i=0;i<k;i++)
	{
     
		printf("%.2f\n",sum[i]);
	}
	return 0;
 } 

Q数字游戏
题目:https://vjudge.net/problem/%E8%AE%A1%E8%92%9C%E5%AE%A2-T3227
代码:

#include
int main()
{
     
	char s[10];
	gets(s);
	int i;
	int count=0;
	for(i=0;i<8;i++)
	{
     
		if(s[i]=='1')
		count ++;
	}
	printf("%d\n",count);
	return 0;
 } 

Q轻重搭配
题目链接:https://vjudge.net/problem/%E8%AE%A1%E8%92%9C%E5%AE%A2-A2240
代码:

#include
int a[500010];
int n;
//快排 
void qsort(int left,int right)
{
     
	int i,j,t,temp;
	if(left>right)
	return;
	 temp=a[left];
	 i=left;
	 j=right;
	 while(i!=j)
	 {
     
	 	while(a[j]>=temp&&i<j)
	 	j--;
	 	while(a[i]<=temp&&i<j)
	 	i++;
	 	if(i<j)
	 	{
     
	 		t=a[i];
	 		a[i]=a[j];
	 		a[j]=t;
		 }
	 }
	 a[left]=a[i];
	 a[i]=temp;
	 qsort(left,i-1);
	 qsort(i+1,right);
	 return;
 } 
int main()
{
     
	int i;
	scanf("%d",&n);
	int count=n;
	for(i=0;i<n;i++)
	{
     
		scanf("%d",&a[i]);
	}
	//排个序
	 qsort(0,n-1);
	 int m;
	 m=n/2;
	 for(i=0;i<n/2;i++)
	 {
     
	 	while(a[i]*2>a[m]&&m<n)
	 	m++;
	 	if(m>=n)
	 	break;
	 	//如果找到了
		 m++;//后移
		  count--;//少一张票; 
	 }
	 printf("%d",count);
	return 0;
}

你可能感兴趣的:(笔记)