1001大壕哥的字符串
题解:检查字符串是否为回文,记录不同位点个数。如果字符串不是回文,且不同位点数为1,输出YES;如果不同位点数为0(也就是回文串)且串长度为奇数(可以改变最中间的那个),则输出YES;否则,输出NO。
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
char s[105];
while(~scanf("%s",s))
{
int len=strlen(s);
int ans=0;
for(int i=0;i<=(len-1)/2;i++)
if(s[i]!=s[len-i-1])
ans++;
if(ans==1||(ans==0&&len%2==1))
puts("YES");
else puts("NO");
}
return 0;
}
1002:大壕哥与蛇
题解:略
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
int cnt=1;
int i;
for(i=1;i<=n;i++)
{
if(i%2)
{
for(int j=0;j<m;j++)
{
if(j)putchar(' ');
printf("%d",cnt+j);
}
}
else
{
cnt+=2*m-1;
for(int j=0;j<m;j++)
{
if(j)putchar(' ');
printf("%d",cnt-j);
}
cnt++;
}
puts("");
}
}
return 0;
}
1003 大壕哥的数学之旅1
这里给出递归写法:
#include <stdio.h>
void F(int x, int n)
{
char flag;
if (x == n)
{
printf("cos(%d)", n);
return;
}
flag = x % 2 ? '-' : '+';
printf("cos(%d%c", x, flag);
F(x + 1, n);
printf(")");
}
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
if (n == 0)
return 0;
F(1, n);
printf("\n");
}
return 0;
}
1004
递归写法
#include <stdio.h>
void F(int x, int n)
{
char flag;
if (x == n)
{
printf("cos(%d)", n);
return;
}
flag = x % 2 ? '-' : '+';
printf("cos(%d%c", x, flag);
F(x + 1, n);
printf(")");
}
void A(int n)
{
F(1, n);
}
void S(int x, int n)
{
if (x == 1)
{
A(x);
printf("+%d", n - x + 1);
return;
}
printf("(");
S(x - 1, n);
printf(")");
A(x);
printf("+%d", n - x + 1);
}
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
if (n == 0)
return 0;
S(n, n);
printf("\n");
}
return 0;
}
1005大壕哥找w
二分查找
代码
#include<stdio.h>
#include<stdlib.h>
#define maxn 10000000
int v[maxn];
int n,w;
int findw()
{
int l,r,mid;
l=1;
r=n;
while(l+1<r)
{
mid=(l+r)/2;
if(v[mid]<=w)
{
l=mid;
}
else
r=mid;
}
if(v[r]==w)
return r;
if(v[l]==w)
return l;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&v[i]);
}
scanf("%d",&w);
int ans;
ans=findw();
printf("%d\n",ans);
}
return 0;
}
1006大壕哥的party
题解:
二分解法:预处理出每堆的上界二分查找答案。
#include<stdio.h>
#include<string.h>
int a[100100];
int b[100100];
int find(int num,int a[],int n)
{
int l,r,m;
l=0,r=n;
while(l<=r)
{
m=(l+r)/2;
if(a[m]<num)
l=m+1;
else if(a[m]>num)
r=m-1;
else
return m;
}
return l;
}
int main()
{
int n;
int i,m,num;
while(scanf("%d",&n)!=EOF)
{
int cnt=0;
b[cnt++]=0;
for(i=0; i<n; i++)
{
scanf("%d",&a[i]);
b[cnt]=b[cnt-1]+a[i];
cnt++;
}
scanf("%d",&m);
for(i=0; i<m; i++)
{
scanf("%d",&num);
int ans=find(num,b,n);
printf("%d\n",ans);
}
}
return 0;
}
法二:用一个数组标记记录,比如[3,9]是第二段,让a[3]=2,a[4]=2,a[5]=2,…a[8]=,a[9]=2.这样给定一个数m,只要求出a[m]的值就知道它在哪一段了。
代码:
#include<cstdio>
int s[1000010];
using namespace std;
int main()
{
int n,t,a=1,k=1,m;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&t);
for(int j=a;j<t+a;j++)
s[j]=k;
a+=t;
k++;
}
scanf("%d",&m);
for(int i=0;i<m;i++)
{
scanf("%d",&t);
printf("%d\n",s[t]);
}
return 0;
}