ACM-TC工作室第一次聯合招新賽暨新生第一次月賽
A 你想加入ACM集訓隊嗎?
#include<stdio.h>
int main()
{
printf("YES\n");
return 0;
}
B 求最大值
利用桶排,計算出現過的每一個字元的個數。最後用一個for迴圈遍歷所有出現過的字元,求出ascii值與出現次數乘積最大的那一個字元。
#include<stdio.h> #include<string.h> int main() { int num[1000]; char s[600]; while(scanf("%s",s)!=EOF) { int ma=-1,l=strlen(s); memset(num,0,sizeof(num)); for(int i=0;i<l;i++) num[s[i]]++; for(int i=0;i<l;i++) { if(num[s[i]]*s[i]>ma) ma=num[s[i]]*s[i]; } printf("%d\n",ma); } return 0; }
C 去香港吧
利用結構體存放每一個出現過的字元的:字元、位置、ascii值,然後用sort排序直接排序即可。
#include<stdio.h> #include<algorithm> using namespace std; struct node { char c; int num; int asc; }a[10004]; bool cmp(node x,node y) { if(x.asc==y.asc) return x.num<y.num; return x.asc<y.asc; } int main() { int t,n; char s[10004]; scanf("%d",&t); while(t--) { scanf("%d",&n); scanf("%s",s); for(int i=0;i<n;i++) { a[i].c=s[i]; a[i].num=i+1; if(s[i]>='A'&&s[i]<='Z') a[i].asc=s[i]-'A'; else a[i].asc=s[i]-'a'; } sort(a,a+n,cmp); printf("%d",a[0].num); for(int i=1;i<n;i++) printf(" %d",a[i].num); printf("\n"); } return 0; }
D 計算清單
注意,我們要將檔案結束前的所有物體的總價全部相加,當檔案結束後,輸出答案。
#include<stdio.h>
int main()
{
char s[100];
double a,b,sum=0;
while(scanf("%s %lf %lf",s,&a,&b)!=EOF)
sum+=a*b;
printf("%.1f\n",sum);
return 0;
}
E riba2534的拷問
每一個數字都有他們的特點,找出這個特點,並利用這個特點判斷它的值應該是多少,然後進行a+b,輸出答案即可。
這個程式碼是先計算出每一個數字的‘#’有多少個,如果有相同個數的‘#’號,再根據他們的特定的點來判斷他們的值。
每一個數字對應的‘#’號的個數如下:
##### ....# ##### ##### # . . .# ##### ##### ##### ##### ##### . . . . . . . . . . # . . .# ....# . . . . # . . . . # # . . .# # . . . . # . . . . . . . .# # . . .# # . . .# . . #. . . . . . . # . . .# ....# . . . . # . . . . # # . . .# # . . . . # . . . . . . . .# # . . .# # . . .# . . #. . . . . . . # . . .# ....# ##### ##### ##### ##### ##### . . . .# ##### ##### ##### ##### # . . .# ....# # . . . . . . . . # . . . .# . . . .# # . . .# . . . .# # . . .# . . . .# . . #. . . . . . . # . . .# ....# # . . . . . . . . # . . . .# . . . .# # . . .# . . . .# # . . .# . . . .# . . #. . . . . . . ##### ....# ##### ##### . . . .# ##### ##### . . . .# ##### ##### . . . . . . . . . . 20 7 19 19 14 19 21 11 23 21 9 5
#include<stdio.h>
int main()
{
int t,a,b,sum,flag;
char s[7][20];
scanf("%d",&t);
while(t--)
{
sum=0,flag=0;
for(int i=0; i<7; i++)
scanf("%s",s[i]);
for(int i=0; i<7; i++)
{
for(int j=0; j<5; j++)
{
if(s[i][j]=='#')
sum++;
}
}
if(sum==20)
a=0;
else if(sum==7)
a=1;
else if(sum==19)
{
if(s[1][4]=='#'&&s[4][0]=='#')
a=2;
else if(s[1][4]=='#'&&s[4][4]=='#')
a=3;
else
a=5;
}
else if(sum==14)
a=4;
else if(sum==21)
{
if(s[4][0]=='#')
a=6;
else
a=9;
}
else if(sum==11)
a=7;
else
a=8;
sum=0;
for(int i=0; i<7; i++)
{
for(int j=6; j<11; j++)
if(s[i][j]=='#')
sum++;
}
if(sum==9)
flag=1;
sum=0;
for(int i=0; i<7; i++)
{
for(int j=11; j<17; j++)
if(s[i][j]=='#')
sum++;
}
if(sum==20)
b=0;
else if(sum==7)
b=1;
else if(sum==19)
{
if(s[1][16]=='#'&&s[4][12]=='#')
b=2;
else if(s[1][16]=='#'&&s[4][16]=='#')
b=3;
else
b=5;
}
else if(sum==14)
b=4;
else if(sum==21)
{
if(s[4][12]=='#')
b=6;
else
b=9;
}
else if(sum==11)
b=7;
else
b=8;
if(flag)
printf("%d\n",a+b);
else
printf("%d\n",a-b);
}
return 0;
}
F 二進位制加法
從字串最後面往前面進行計算,然後注意進位問題和前導0問題就行了。
也可以用昨天晚上學長講的大數加法的方法來做,我就是想告訴你們可以這樣做而已。
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int ans[1003],la,lb,l,k;
char a[1003],b[1003];
while(~scanf("%s%s",a,b))
{
la=strlen(a);
lb=strlen(b);
l=max(la,lb);
k=0;
memset(ans,0,sizeof(ans));
for(int i=1; i<=l; i++)
{
if(la-i>=0&&lb-i>=0)
ans[l-i]=(a[la-i]-'0')+(b[lb-i]-'0')+k;
else if(la-i<0)
ans[l-i]=(b[lb-i]-'0')+k;
else
ans[l-i]=(a[la-i]-'0')+k;
k=ans[l-i]/2;
ans[l-i]%=2;
}
if(k)
printf("1");
for(int i=0; i<l; i++)
{
if(ans[i]==0&&k==0)
continue;
else
{
printf("%d",ans[i]);
k=1;
}
}
if(k==0)
printf("0\n");
printf("\n");
}
return 0;
}
G 2D蛋糕
直接計算蛋糕的每一種邊和蛋糕的長寬關係,利用這個關係計算每一種邊的個數即可。
具體關係你畫一個圖就知道了。
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int t,a,b;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&a,&b);
int zero=0,one=0,two=0,three=0,four=0;
if(a<2||b<2)
zero=0;
else
zero=(a-2)*(b-2);
if(b>1&&a>2)
one+=(a-2)*2;
if(a>1&&b>2)
one+=(b-2)*2;
if(a>1&&b>1)
two=4;
if(a==1&&b==1)
four=1;
else if(a==1||b==1)
{
three=2;
two=max(a,b)-2;
}
printf("%d %d %d %d %d\n",zero,one,two,three,four);
}
return 0;
}
H 九宮格解鎖
將九宮格標記序號:
1 2 3
4 5 6
7 8 9
先用一個二維陣列a[10][10],將所有可行的路徑標記為1:如從1可以到5,那麼我們使a[1][5]=1;
利用for迴圈將字串遍歷:如果這個字元到下一個字元是可行的,將這個字元妨礙到的其它的字元標記為1,例如:本來從1到3為不可行的,但是我們如果已經使用過2,那麼把a[1][3]=1,a[3][1]=1,標記為可行。如果著一個字元到下一個字元為不可行的,直接退出for迴圈輸出NO。
1、如何判斷兩個字元是否可行?假設第一個字元化為整數是x,第二個字元化為整數是y,判斷a[x][y]是否等於1即可。
2、如何退出for迴圈?用一個flag標記,flag==0表示我們這個for迴圈執行到字串結束,flag==1表示我們提前退出for迴圈。
3、memcpy(a,b,sizeof(a))是什麼意思?讓b陣列變成與a陣列完全相同的陣列。(實在不能理解的話,就把a陣列定義在while迴圈裡面,去掉b陣列)。
#include<stdio.h>
#include<string.h>
int t;
char s[10];
int a[10][10],b[10][10]=
{
// 1 2 3 4 5 6 7 8 9
{0,0,0,0,0,0,0,0,0,0},//0
{0,0,1,0,1,1,1,0,1,0},//1
{0,1,0,1,1,1,1,1,0,1},//2
{0,0,1,0,1,1,1,0,1,0},//3
{0,1,1,1,0,1,0,1,1,1},//4
{0,1,1,1,1,0,1,1,1,1},//5
{0,1,1,1,0,1,0,1,1,1},//6
{0,0,1,0,1,1,1,0,1,0},//7
{0,1,0,1,1,1,1,1,0,1},//8
{0,0,1,0,1,1,1,0,1,0}//9
};
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
memcpy(a,b,sizeof(a));
int flag=0,l=strlen(s);
for(int i=0; i<l-1; i++)
{
int x=s[i]-'0';
int y=s[i+1]-'0';
if(a[x][y])
{
if(x==2)
{
a[1][3]=1;
a[3][1]=1;
}
else if(x==4)
{
a[1][7]=1;
a[7][1]=1;
}
else if(x==5)
{
a[1][9]=1;
a[2][8]=1;
a[3][7]=1;
a[4][6]=1;
a[6][4]=1;
a[7][3]=1;
a[8][2]=1;
a[9][1]=1;
}
else if(x==6)
{
a[3][9]=1;
a[9][3]=1;
}
else if(x==8)
{
a[7][9]=1;
a[9][7]=1;
}
else
continue;
}
else
{
flag=1;
break;
}
}
if(flag)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
I 列印田字,超級簡單
找規律的題目。
#include<stdio.h>
#include<string.h>
int main()
{
int n,m;
char a[1003][1003];
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(a,0,sizeof(a));
for(int i=0; i<=n; i++)
{
for(int j=0; j<=m; j++)
a[i][j]=' ';
}
for(int i=0; i<m; i++)
{
a[0][i]='*';
a[n/2][i]='*';
a[n-1][i]='*';
}
for(int i=0; i<n; i++)
{
a[i][0]='*';
a[i][m/2]='*';
a[i][m-1]='*';
}
for(int i=0; i<n; i++)
printf("%s\n",a[i]);
printf("\n");
}
return 0;
}
J 神奇的掛鐘
要知道從11點~12點鐘聲不會敲響,從23點到24點鐘聲也不會敲響。
直接b-a,然後判斷上面的情況出現了幾次,減去這個次數。
#include<stdio.h>
int main()
{
int t,a,b;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&a,&b);
int num=0,sum=b-a;
while(a<b)
{
a++;
if(a==12||a==24)
num++;
}
printf("%d\n",sum-num);
}
return 0;
}