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;
}