1.
此题目很简单只要建立一个26字母数组来统计每个字母出现的次数。代码如下。
#include<stdio.h>
#include<string.h>
int max;
char a[1001];
int b[26];
int main()
{
scanf("%s",a);
int len=strlen(a);
for(int j=0;j<len;j++)
{
b[a[j]-'a']++;
}
for(int i=0;i<26;i++)
{
if(b[i]>b[max])
max=i;
}
printf("%c",max+'a');
return 0;
}
2.
此题目就是枚举。先把a能最多耗费多少食物算出来,然后因为不知道a食物需要几份。所以需要枚举每一项的b所做出来几份。最后总份数计算每此枚举的最大值。
#include<stdio.h>
int main()
{
int t,a[11],b[11],c[11],d[11],y;
scanf("%d",&t);
int min=9999999,sum=0,min2=9999999;
for(int i=0;i<t;i++)
{
scanf("%d",&a[i]);
}
for(int i=0;i<t;i++)
{
scanf("%d",&b[i]);
}
for(int i=0;i<t;i++)
{
scanf("%d",&c[i]);
}
for(int i=0;i<t;i++)
{
if(b[i]!=0)
{
if(min>a[i]/b[i])
min = a[i]/b[i];
}
}
for(int j=0;j<=min;j++)
{
for(int i=0;i<t;i++)
{
y=a[i]-j*b[i];
if(c[i]==0)
continue;
if(min2>y/c[i])
min2=y/c[i];
}
if(sum<j+min2)
sum=j+min2;
}
printf("%d",sum);
return 0;
}
3.
此题目只要理解了题意就很简单。意思是n表示从1~k个字符抽取n个字符组合字符串h,要使从s串中间删除某些元素使得s串能变成所有的h串的组合,然后让我们找到长度最短的s串。其实就是重复输出k个小写字母这里直接就是从a开时就行。
#include <stdio.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
{
for(int j=0;j<k;j++)
{
printf("%c",'a'+j);
}
}
printf("\n");
}
return 0;
}
4.
此题因为一个数的约数可以是几个数的约数而且这几个数之和等于这个数,只要知道每个约数然后枚举出来就行。
#include<stdio.h>
int main()
{
int t,x,n,max=0;
scanf("%d",&t);
while(t--)
{
max=0;
scanf("%d %d",&x,&n);
for(int i=1;i*i<=x;i++)
{
if(x%i==0)
{
int b=x/i;
if(b>=n)
{
if(max<i)
max=i;
}
if(i>=n)
{
if(max<b)
max=b;
}
}
}
printf("%d\n",max);
}
return 0;
}
5.
这个题很简单因为不断靠近的终点值假设这个终点值在右上角也就是都为正数肯定是先上再右或者先右再上。其实就只要算能向上多少与能向右多少。两个值相减去就是要停下来的次数。注意当为0时就不需要停。
#include<stdio.h>
#include<math.h>
int main()
{
int t,a,b;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&a,&b);
int c=abs(abs(a)-abs(b));
int z;
if(c==0)
z=c;
else
z=c-1;
printf("%d\n",abs(a)+abs(b)+z);
}
return 0;
}
6.
此题目为搜索题但有点不一样,我这里是dfs的方法。首先我要设置三个参数两个表示位置一个表示方向。设两个二维数组, searched
数组用于标记是否曾以某方格为起点进行搜。而 reachable
数组用于标记某方格是否可到达。中间记得舍去反方向搜索的防止重复搜索。代码如下。
#include <stdio.h>
#define MAX_R 210
#define MAX_C 210
int dr[5] = { 0, -1, 0, 0, 1 };
int dc[5] = { 0, 0, -1, 1, 0 };
int n,m;
char sq[MAX_R][MAX_C];
int searched[MAX_R][MAX_C];
int reachable[MAX_R][MAX_C];
void dfs( int r, int c, int z);
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i)
{
scanf("%s", sq[i] + 1);
}
dfs(2, 2, 0);
int cnt = 0;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
cnt += reachable[i][j];
}
}
printf("%d\n", cnt);
return 0;
}
void dfs( int r, int c, int z) {
if (searched[r][c]) {
return;
}
searched[r][c] = 1;
reachable[r][c] = 1;
for (int i= 1; i <= 4; ++i)
{
if (i + z == 5)
{
continue;
}
int x = r, y= c;
while (sq[x + dr[i]][y + dc[i]] == '.')
{
x += dr[i];
y += dc[i];
reachable[x][y] = 1;
}
dfs(x, y, i);
}
}
今天学的很杂,导致我最后写补题的时候头脑有点转不过来所以今天很慢。希望明天的状态更好。