1001 排座位
由题目可知没有两个队员面对面相坐,且没有队员相邻相坐,且没有队员对角相坐,由此可知每隔一个位置坐一个人;
当n为奇数时,答案为(n+1)/2,
当n为偶数时,答案为(n)/2;
因为整数除法是整除,所以答案就是(n+1)/2;
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
printf("%d",(n+1)/2);
return 0;
}
1002 maomeng的图形
这题就直接找规律,直接上代码
当然直暴力枚举判断打印13种图形也是可以的
#include<stdio.h>
void xing(int x){//自定义函数打印星号
int i;
for(i=1;i<=x;i++){
printf(" *");
}
printf("\n");
}
void kong(int x){//自定义函数打印空格
int i;
for(i=0;i<x;i++)printf(" ");
}
int main(){
int n,i;
scanf("%d",&n);
kong(n-2);xing(n);
for(i=2;i<=n;i++){
kong(n-i);
printf("*");
kong(2*n-1+(i-2)*2);
printf("*\n");
}
for(i=n-1;i>=2;i--){
kong(n-i);
printf("*");
kong(2*n-1+(i-2)*2);
printf("*\n");
}
kong(n-2);xing(n);
return 0;
}
1003 欧透与炫狗
由题意可得,找三个数字中间的数最大,对于每个数来说,只要找前面有几个数比当前这个数小,后面有几个数比当前数小,然后进行排列组合。
然后2重循环就能得出答案。因为最终的答案很大,所以要开long long。
很多人都是三重循环寻找三个点,这个循环的次数达到了1e12,所以会超时,需要减少循环次数。
#include<stdio.h>
int w[10010];
int main(){
int n,i,s1,s2,j;
long long res=0;
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&w[i]);
for(i=2;i<=n-1;i++){
s1=s2=0;
for(j=1;j<i;j++){//前面比第i个数小的个数
if(w[j]<w[i])s1++;
}
for(j=i+1;j<=n;j++){//后面比第i个数小的个数
if(w[j]<w[i])s2++;
}
res+=s1*s2;
}
printf("%lld",res);
return 0;
}
1004 小球反弹
由题意可得,w代表的是左右方向的大小,h代表上下方向的大小。
以左右方向为例:
我们将坐标轴分成无限个长度为w的区间
往左看第一个区间是从左往右的长度,第二个区间是从右往左的长度。
往右看第一个区间也是从左往右的长度,第二个区间也是从右往左的长度。
通过找规律可知奇数倍的区间是左往右的长度,偶数倍的区间是右往左的长度。
同理上下也是如此
(代码中的区间标记是以0开始的,题解中的区间标记是以1开始的)
#include<stdio.h>
int abs(int a){
if(a<0)a=-a;
return a;
}
int main(){
int n,m,t;
scanf("%d%d%d",&n,&m,&t);
while(t--){
int a,b,c;
char op[4];
scanf("%d%d%d%s",&a,&b,&c,op);
if(op[0]=='R')a+=c;
else if(op[0]=='L')a-=c;
else if(op[0]=='U')b-=c;
else b+=c;
a=abs(a);b=abs(b); //将a,b取正数便于计算。
int t1=a/n,t2=b/m; //整除计算所在的区间是奇还是偶
if(t1%2==0)printf("%d ",a%n);
else printf("%d ",n-a%n);
if(t2%2==0)printf("%d\n",b%m);
else printf("%d\n",m-b%m);
}
return 0;
}
1005 maomeng的答题卡
由题意可得二维码的大小为n,有m个涂过的点
对于一个全部都是数字的字符串,将它分为两个数字,例如0404(4,4)、404(4,4);
而对于其中有特殊字符的字符串,以特殊字符为分隔线分为两个数字,例如04/04(4,4)、4/4(4,4)、04/4(4,4)、4/04(4,4);
然后对这个坐标进行涂点(注意行列是相反的,例如字符串得出的坐标是(4,5),实际上涂的点是(5,4))
因为有前导0的情况,所以我们从后往前枚举两个数字
#include<stdio.h>
#include<string.h>
int g[110][110];
char s[110];
int n,m,len,i,j;
int sum,a,b,flag;//flag判断是否取出了一个数
// a代表第一个数,b代表第二个数。
int main(){
scanf("%d%d",&n,&m);
while(m--){
sum=flag=0;j=1;
scanf("%s",s);len=strlen(s);
for(i=len-1;i>=0;i--){
if(s[i]==';'||s[i]=='/'){//以特殊符号为分隔符
if(flag==0){
j=1;b=sum;sum=0;flag=1;
}
continue;
}
sum=sum+j*(s[i]-'0');//取出这个数字
j=j*10;
if(j==100&&flag==0){//假如已经取出两位数
j=1;b=sum;sum=0;flag=1;
}
}
a=sum;
g[b][a]=1;//涂点
}
for(i=n;i>=1;i--){
for(j=1;j<=n;j++){
if(g[i][j]==1)printf("#");
else printf(".");
}
printf("\n");
}
return 0;
}