台州學院1024程式設計師節新生C語言大賽題解
阿新 • • 發佈:2021-10-24
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的圖形
這題就直接找規律,直接上程式碼
#include<stdio.h> void xing(int x){//自定義函式列印星號 int i; for(i=1;i<=x;i++){ printf(" *"); } } void kong(int x){//自定義函式列印空格 int i; for(i=0;i<x;i++)printf(" "); } int main(){ int n,i; scanf("%d",&n); kong(n-2); for(i=0;i<n;i++){ printf(" *"); } printf("\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); for(i=0;i<n;i++){ printf(" *"); } printf("\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++){ if(w[j]<w[i])s1++; } for(j=i+1;j<=n;j++){ if(w[j]<w[i])s2++; } res+=s1*s2; } printf("%lld",res); return 0; }
1004 小球反彈
由題意可得,w代表的是左右方向的大小,h代表上下方向的大小。
以左右方向為例:
我們將座標軸分成無限個長度為w的區間
往左看第一個區間是從左往右的長度,第二個區間是從右往左的長度。
往右看第一個區間也是從左往右的長度,第二個區間也是從右往左的長度。
通過找規律可知奇數倍的區間是左往右的長度,偶數倍的區間是右往左的長度。
同理上下也是如此
#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); 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;
}