近日做题题解总结

P1540机器翻译题解

因为没有理解题目,在做题过程中遇到了许多困难。本人感觉要注意一下几点:
1.当a数组中还未存入b数组的元素若已在b数组中出现,就不应再存入b数组中。2.要先判断再进行b数组的储存。3.将b数组中的元素往前移一位时应当记得给最后一个元素赋值。

#include<stdio.h>
int main()
{
	int N,M,a[1005],b[1000],j,flag=1,t,i,z=1;
	scanf("%d%d",&M,&N);
	for(i=0;i<N;i++)
		{
			scanf("%d",&a[i]);
		}
	b[0]=a[0];
	for(i=1;i<N;i++)
		{
			if(z<M){
				
				
					for(t=0;t<z;t++)
						{
						if(a[i]==b[t])break;
						}
				if(t==z){
					flag++;
					b[z]=a[i];
					z++;
				}
				
			}//数组b未存满的情况
			else{
				
					
				for(t=0;t<M;t++)
					{
						if(a[i]==b[t])break;
					}
				if(t==M){
					flag++;
					for(j=1;j<M;j++)
					{
						b[j-1]=b[j];
					}
					b[j-1]=a[i];
				}
			}
		 } //数组b已存满的情况
	printf("%d",flag);
	return 0;
}

P1098字符串的展开题解

会有几种比较坑人的情况:
1.开头或者末尾出现'-'。2.出现连续的连字符。3.连字符两端可能不一致,比如数字和字母,大写字母和小写字母。(出现这种情况连字符就保留原样,不用再改变什么了。)
由于我太菜了,没有很好地掌握三目运算符,写的代码分的情况较多也比较长。

#include<stdio.h>
#include<string.h> 
int main()
{
	char s[10000],y;
	int p1,p2,p3,x,r,t,j,i,n;
	scanf("%d%d%d",&p1,&p2,&p3);
	scanf("%s",s);
	for(i=0;s[i]!='\0';i++)
		{
			if(s[i]=='-'&&i!=0&&s[i+1]!='\0'){
				if(s[i+1]-s[i-1]==1){
					x=strlen(s);
					for(j=i;j<x;j++)
						{
							s[j]=s[j+1];
							
						}
					s[x-1]='\0';
				}
				else if(s[i+1]-s[i-1]>1){
						t=s[i+1]-s[i-1]-1;
						x=strlen(s);
						n=x;
						if(s[i-1]>=65&&s[i-1]<=90&&s[i+1]>=65&&s[i+1]<=90){
						for(j=x+p2*t-2,r=0;r<x-i;r++)
								{
									s[j]=s[n-1];
									n--;
									j--;
								}
						s[x+p2*t-1]='\0';
							if(p1==1){
								if(p3==1){
									for(n=p2,r=0,j=i,y=s[i-1];r<t*p2;r++)
										{
											s[j]=y+1+32;
											j++;
											n--;
											if(n==0){
												y++;
												n=p2;
											}
											}	}
								else{
									for(n=p2,r=0,j=i+p2*t-1,y=s[i-1];r<p2*t;r++)
										{
											s[j]=y+1+32;
											j--;
											n--;
											if(n==0){
												y++;
												n=p2;
											}
									}
											
										}
								
							}
							else if(p1==2){
								if(p3==1){
									for(n=p2,r=0,j=i,y=s[i-1];r<=t;r++)
										{
											s[j]=y+1;
											j++;
											n--;
											if(n==0){
												y++;
												n=p2;
											}
											}	}
								else{
									for(n=p2,r=0,j=i+p2*t-1,y=s[i-1];r<p2*t;r++)
										{
											s[j]=y+1;
											j--;
											n--;
											if(n==0){
												y++;
												n=p2;
											}
									}
											
										}
							}
							else{
								for(j=i;j<i+p2*t;j++)
									{
										s[j]='*';
									}
							}
						}//两端都是大写字母的情况
					
				else if(s[i-1]>=97&&s[i-1]<=122&&s[i+1]>=97&&s[i+1]<=122){
					for(j=x+p2*t-2,r=0;r<x-i;r++)
								{
									s[j]=s[n-1];
									n--;
									j--;
								}
					s[x+p2*t-1]='\0';
					if(p1==1){
								if(p3==1){
									for(n=p2,r=0,j=i,y=s[i-1];r<p2*t;r++)
										{
											s[j]=y+1;
											j++;
											n--;
											if(n==0){
												y++;
												n=p2;
											}
											}	}
								else{
									for(n=p2,r=0,j=i+p2*t-1,y=s[i-1];r<p2*t;r++)
										{
											s[j]=y+1;
											j--;
											n--;
											if(n==0){
												y++;
												n=p2;
											}
									}
											
										}
								
							}
							else if(p1==2){
								if(p3==1){
									for(n=p2,r=0,j=i,y=s[i-1];r<p2*t;r++)
										{
											s[j]=y+1-32;
											j++;
											n--;
											if(n==0){
												y++;
												n=p2;
											}
											}	}
								else{
									for(n=p2,r=0,j=i-1+p2*t,y=s[i-1];r<p2*t;r++)
										{
											s[j]=y+1-32;
											j--;
											n--;
											if(n==0){
												y++;
												n=p2;
											}
									}
											
										}
							}
							else{
								for(j=i;j<i+p2*t;j++)
									{
										s[j]='*';
									}
							}
						}//两端都是小写字母的情况
				else if(s[i-1]>=48&&s[i-1]<=57&&s[i+1]>=48&&s[i+1]<=57){
					for(j=x+p2*t-2,r=0;r<x-i;r++)
								{
									s[j]=s[n-1];
									n--;
									j--;
								}
					s[x+p2*t-1]='\0';
					if(p1==3){
						for(j=i;j<i+p2*t;j++)
									{
										s[j]='*';
									}
					}
					else{
						if(p3==1){
						
							for(n=p2,r=0,j=i,y=s[i-1];r<p2*t;r++)
										{
											s[j]=y+1;
											j++;
											n--;
											if(n==0){
												y++;
												n=p2;
											}
											}			
						}
						else{
							for(n=p2,r=0,j=i+p2*t-1,y=s[i-1];r<p2*t;r++)
										{
											s[j]=y+1;
											j--;
											n--;
											if(n==0){
												y++;
												n=p2;
											}
									}
						}
					}//两端都是数字的情况
				}	
				}
				}
			}
	printf("%s",s)	;
	return 0;
 } 

P1478陶陶摘苹果(升级版)题解

这道题到不是很难,主要是一个小点(数组c开得太小啦,多加一个0一下就AC了......有点无语......)一直没发现,让我一直AC不了,对这道题花了很多时间,因此想要纪念一下。梳理一下我的思路吧:
1.将陶陶可以摘到的苹果的力气值存入数组c。2.将这些存入数组c的力气值从小到大快排。3.将这些力气值累加,当累加的力气值大于陶陶所拥有的力气值时,则陶陶没力气摘苹果了。

#include<stdio.h>
#include<stdlib.h>

int main()
{
	int cmp(const void *x, const void *y);
	int n,s,a,b,i,j,z=0,c[10000],r;
	scanf("%d%d",&n,&s);
	scanf("%d%d",&a,&b);
	for(r=0;r<n;r++)
		{
			scanf("%d%d",&i,&j);
			if(a+b>=i){
				c[z]=j;
				z++;
			}//将可摘苹果存入一个新数组
			
		}
	if(z==0){
		printf("0\n");
		return 0;
	}
	qsort(c,z,sizeof(int),cmp);
	int t=c[0],flag=0;
	for(i=1;i<z;i++)
		{
			if(t>s)break;
			
			t+=c[i];
			flag++;
		}//在力气值的基础上再判断可摘苹果的个数
	printf("%d\n",flag);
	return 0;
}
int cmp(const void *x, const void *y)
{
	return *(int*)x-*(int*)y;
}

以上就是这几天困扰我的几题题目的题解,由于本人太菜,一题就要做好久,所以题量也不是很多。

posted @ 2020-02-09 18:34  尼古拉斯宝莉  阅读(148)  评论(0编辑  收藏  举报