坐标:BUPT;OJ:Excited OJ (BOJ-V4)
好多小伙伴问我要源码,我有时也不是很方便,所以把我现在还能看到题目的几次练习的源码发出来,大家可以一起相互学习,欢迎交流、讨论!
直接抄袭代码是禁止的哦~~
(如果不是左爷班的可能题目会有些不同……)
PS:本人蒟蒻orz
主要与字符串处理有关,相关易错点:
'\n'
'\0'
没有存入#include
int a[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char c[12]="10X98765432";
char s[19];
int t,sum;
int main(void)
{
scanf("%d",&t);
for (int i=1; i<=t; i++)
{
scanf("%s",s);
sum=0;
for (int j=0; j<17; ++j)
sum+=a[j]*(s[j]-'0');
printf("%d\n",sum);
if (c[sum%11]==s[17])
printf("right\n");
else
printf("wrong\n");
}
return 0;
}
/*
2
34052419800101001X
310105199412049278
*/
PS:一个一个特判的,我佩服你们
#include
#include
char s[105];
int cnt;
int main(void)
{
scanf("%s",s);
int len=strlen(s);
for (int i=0; i<len; i++)
{
if (s[i]=='(')
cnt++;
if (s[i]==')')
cnt--;
if (cnt<0)
break;
}
if (cnt)
printf("parentheses do not match!\n");
else
printf("parentheses match!\n");
return 0;
}
PS:注意)(是要判错的就OK了
#include
#include
int upper[27];
int lower[27];
char s[105];
int main(void)
{
scanf("%s",s);
int len=strlen(s);
for (int i=0; i<len; ++i)
{
if (s[i]>='A' && s[i]<='Z')
upper[s[i]-'A']++;
if (s[i]>='a' && s[i]<='z')
lower[s[i]-'a']++;
}
for (int i=0; i<26; ++i)
if (upper[i]!=0)
printf("The character %c has presented %d times.\n",i+'A',upper[i]);
for (int i=0; i<26; ++i)
if (lower[i]!=0)
printf("The character %c has presented %d times.\n",i+'a',lower[i]);
return 0;
}
#include
#include
char s[105],up[27],lo[27];
int main(void)
{
scanf("%s",s);
int len=strlen(s);
for (int i=0; i<len; i++)
if (s[i]=='Z' || s[i]=='z')
s[i]+='a'-'z';
else
s[i]++;
scanf("%s",up);
scanf("%s",lo);
for (int i=0; i<len; ++i)
{
if (s[i]>='A' && s[i]<='Z')
s[i]=up[s[i]-'A'];
if (s[i]>='a' && s[i]<='z')
s[i]=lo[s[i]-'a'];
}
printf("%s",s);
return 0;
}
/*
IlovelanguageC
OPDGHSTABNRYZCQJKLMIXEFUVW
hpzaeongxrbcljwtskfymdqiuv
NltqolpwgdpgoG
*/
PS:没什么好说的,仔细看题
这一次就是经典三大排序+二分查找
emmmm这要怎么错……肯定都能AK但还是自己打一遍练练手熟吧
#include
#include
#include
#include
#include
#define For(i,a,b) for (int i=(a); i<=(b); ++i)
void swap(int* a, int* b)
{
int t=*a;
*a=*b;
*b=t;
}
int main(void)
{
int n;
scanf("%d",&n);
int a[n];
For(i,1,n)
scanf("%d",&a[i]);
bool ok;
for (int i=n-1; i>=1; i--)
{
ok=true;
For(j,1,i)
if (a[j]>a[j+1])
{
swap(&a[j],&a[j+1]);
ok=false;
}
if (ok==true)
break;
}
For(i,1,n)
printf("%d ",a[i]);
return 0;
}
#include
#include
#include
#include
#include
#define For(i,a,b) for (int i=(a); i<=(b); ++i)
int main(void)
{
int n,i,j,k,temp;
scanf("%d",&n);
int a[n];
For(i,1,n)
scanf("%d",&a[i]);
For(i,2,n)
{
for (j=i-1; j>=0; j--)
if (a[j]<a[i])
break;
if (j!=i-1)
{
temp=a[i];
for (k=i-1; k>j; k--)
a[k+1]=a[k];
a[k+1]=temp;
}
For(i,1,n)
printf("%d ",a[i]);
printf("\n");
}
return 0;
}
#include
#include
#include
#include
#include
#define For(i,a,b) for (int i=(a); i<=(b); ++i)
void swap(int* a, int* b)
{
int t=*a;
*a=*b;
*b=t;
}
int main(void)
{
int n,i,j,k;
scanf("%d",&n);
int a[n];
For(i,1,n)
scanf("%d",&a[i]);
For(i,1,n-1)
{
k=i;
For(j,i+1,n)
if (a[j]<a[k])
k=j;
if (k!=i)
swap(&a[i],&a[k]);
For(i,1,n)
printf("%d ",a[i]);
printf("\n");
}
return 0;
}
#include
#include
#include
#include
#include
#define For(i,a,b) for (int i=(a); i<=(b); ++i)
const int N=2e6+5;
int a[N];
int n,m,t;
int bs(int x)
{
int mid;
int l=1, r=n;
while(l<=r)
{
mid=(l+r)/2;
if (x==a[mid])
return mid-1;
else
if(x<a[mid])
r=mid-1;
else
l=mid+1;
}
return -1;
}
int main(void)
{
scanf("%d%d",&n,&m);
For(i,1,n)
scanf("%d",&a[i]);
For(i,1,m)
{
scanf("%d",&t);
printf("%d ",bs(t));
}
return 0;
}
/*
15
20
-293 -213 -23 0 1 5 11 23 56 67 87 273 999 2132 10000
-23 -99999 0 999 953 67 56 44 33 87 -293 23 11 273 -213 2132 10000 87654 1 5
*/
好像这次的题需要稍微想想?
记住OJ采用的是“黑盒测试”,我们不必过多展示技巧,能A了就完了(在没有助教人工阅卷的情况下)
Keep It Simple and Stupid
#include
#define For(i,a,b) for (int i=(a); i<=(b);++i)
int main()
{
int m,n;
scanf("%d%d",&m,&n);
int a[m+1][n+1];
For(i,1,m)
For(j,1,n)
scanf("%d",&a[i][j]);
For(i,1,n)
{
For(j,1,m)
printf("%d ",a[j][i]);
printf("\n");
}
return 0;
}
/*
3 5
5 5 5 5 5
3 3 3 3 3
1 1 1 1 1
*/
#include
int main()
{
float t[5]={0};
float a[6][5]={0};
int n,y,x;
float v;
scanf("%d",&n);
for (int i=1; i<=n; ++i)
{
scanf("%d%d%f",&y,&x,&v);
a[x][y]+=v;
t[y]+=v;
}
for (int i=1; i<=5; ++i)
{
float sum=0;
for (int j=1; j<=4; j++)
{
printf("%.1f\t",a[i][j]);
sum+=a[i][j];
}
printf("%.1f\n",sum);
}
float total=0;
for (int i=1; i<=4; i++)
{
printf("%.1f\t",t[i]);
total+=t[i];
}
printf("%.1f",total);
return 0;
}
/*
4
1 1 35.6
1 2 23.1
1 1 89.3
4 5 22.6
*/
PS:一定要好好看题TAT,亏我还给他打了那么好看的一张带表头的表……
#include
#define For(i,a,b) for (int i=(a); i<(b); ++i)
int main()
{
int m,n;
scanf("%d%d",&m,&n);
int a[m][n];
For(i,0,m)
For(j,0,n)
scanf("%d",&a[i][j]);
int x[n];
For(j,0,n)
{
x[j]=a[0][j];
For(i,1,m)
x[j]=(a[i][j]<x[j])?a[i][j]:x[j];
}
For(i,0,n)
printf("%d ",x[i]);
return 0;
}
/*
3 4
22 45 56 30
19 33 45 38
20 22 66 40
*/
#include
#include
int m,n;
int a[100][100]={0};
bool ismin(int x,int y)
{
for (int i=0; i<m; i++)
if (a[i][y]<a[x][y])
return false;
return true;
}
int main()
{
scanf("%d%d",&m,&n);
int max[m];
for (int i=0; i<m; i++)
{
int maxn=0;
for (int j=0; j<n; j++)
{
scanf("%d",&a[i][j]);
if (a[i][j]>maxn)
{
maxn=a[i][j];
max[i]=j;
}
}
}
for (int i=0; i<m; ++i)
{
if (ismin(i,max[i]))
{
printf("The saddle point is (%d,%d)=%d.",i,max[i],a[i][max[i]]);
return 0;
}
}
printf("There is no saddle point in the matrix.");
return 0;
}
/*
4 5
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
*/
PS:其实此题要调用函数的话,应该先求列,再求行……
但是在机考时这些是无所谓的,只要能A就完了!
好吧我承认我打的丑QAQ
#include
typedef long long ll;
int a[100][100];
ll b[100];
const ll INF=1e6+5;
int n;
void print(int x[],int size)
{
for (int i=0; i<size; ++i)
printf("%d ",x[i]);
printf("\n");
}
int main()
{
scanf("%d",&n);
for (int i=0; i<n; i++)
for (int j=0; j<n; j++)
{
scanf("%d",&a[i][j]);
b[i]+=a[i][j];
}
for (int j=0; j<n; j++)
{
ll min=INF*n;
int p=0;
for (int i=0; i<n; ++i)
{
if (b[i]<min)
{
min=b[i];
p=i;
}
}
print(a[p],n);
b[p]=INF*n;
}
return 0;
}
/*
3
5 5 5
3 3 3
1 1 1
*/
PS:你也可以选择写函数,有很多同学问我题的时候是写的函数,只要注意一些细节就好了
题目中矩阵元素到1e6了,范围还是100个,如果用int存怕是要溢出
话说这个题特别像我初中参加NOIP时的T3……
当时我还不知道什么是矩阵呢QAQ
#include
int main()
{
int n;
scanf("%d",&n);
int a[n+1][n+1];
int num=1;
int x=1,y=1,p=1;
for( ; num<=n*n; ++num)
{
a[x][y]=num;
if (y==1&&x!=n || y==n)
{
a[++x][y]=++num;
p=-p;
x+=p;
y-=p;
continue;
}
if (x==1&&y!=n || x==n)
{
a[x][++y]=++num;
p=-p;
x+=p;
y-=p;
continue;
}
x+=p;
y-=p;
}
for (int i=1; i<=n; i++)
{
for (int j=1; j<=n; j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}
PS:无非两种操作撞到边界了蛇要下移或者右移,没撞到的时候走一个对角
我知道你们肯定有比我打的好看的orz
题目太水,练练手就完了
注意:
#include
#include
#include
#include
#include
#define For(i,a,b) for (int i=(a); i<=(b); ++i)
int main()
{
char s[105];
char c;
scanf("%s",s);
getchar();
scanf("%c",&c);
int len=strlen(s)-1;
For(i,0,len)
{
if (s[i]!=c)
printf("%c",s[i]);
}
return 0;
}
PS:这个题打的太水……主要是 太懒 这样打的快
就问题的同学们来看,如果采用for循环遍历数组的话,记得在删除字符后,i(index)需要 - -,相当于你的检查光标回退了一格;如果你RE了,请你把数组开大一点试试
没水,打的指针2333
#include
#include
#include
#include
#include
#define For(i,a,b) for (int i=(a); i<=(b); ++i)
char* strstr(char* s1, char* s2)
{
int len1=strlen(s1), len2=strlen(s2);
For(i,0,len1-1)
{
if(s1[i]==s2[0])
{
bool flag=true;
int j=1;
while (flag && j<len2)
{
flag=(s1[i+j]==s2[j]);
j++;
if (i+j>=len1)
flag=false;
}
if (flag)
return s1+i;
}
}
return NULL;
}
int main()
{
char s1[505],s2[505];
gets(s1);
gets(s2);
if (strstr(s1,s2))
{
puts(strstr(s1,s2));
}
else
printf("NULL!");
return 0;
}
/*
didjfsd dabcxxxxxx
abc
*/
又打水了2333
#include
#include
#include
#include
#include
#define For(i,a,b) for (int i=(a); i<=(b); ++i)
int main()
{
char s[10005];
gets(s);
int len=strlen(s)-1;
int a[1005];
int cnt=-1;
For(i,0,len)
{
if (s[i]==' ')
{
s[i]='\0';
cnt++;
a[cnt]=i;
}
}
puts(s);
For(i,0,cnt)
puts((char*)(s+a[i]+1));
return 0;
}
/*
You are great
You
are
great
*/
#include
#include
#include
#include
#include
#define For(i,a,b) for (int i=(a); i<=(b); ++i)
int main()
{
int *a,n;
scanf("%d",&n);
a=(int*)malloc(sizeof(int)*n);// 建立长度为n的动态整型数组
For(i,0,n-1)
{
scanf("%d",&a[i]);
a[i]=-10*a[i];
}
For(i,0,n-1)
printf("%d ",a[i]);
free(a);//释放动态内存
return 0;
}
#include
#include
#include
#include
#include
#define For(i,a,b) for (int i=(a); i<=(b); ++i)
int main()
{
int **a,n,m;
scanf("%d%d",&n,&m);
a=(int **)malloc(sizeof(int *)*n);//建立长度为n的动态指针数组
For(i,0,n-1)
a[i]=(int *)malloc(sizeof(int)*m);//建立长度为m的一维整型数组
For(i,0,n-1)
For(j,0,m-1)
{
scanf("%d",&a[i][j]);
a[i][j]=-10*a[i][j];
}
For(i,0,n-1)
{
For(j,0,m-1)
printf("%d ",a[i][j]);
printf("\n");
}
For(i,0,n-1)
free(a[i]);
free(a);//释放动态内存
return 0;
}
老师怕你不会写都把源码放在题目里了2333