CONTEST1001 题解
PROBLEM A
分析
這個題屬于非常基礎的輸出問題,一般來說見到這種題可以直接復制粘貼即可。
講解
?沒有什么詳細說明的直接復制粘貼即可。這樣不容易出錯。
代碼
?
#include <stdio.h> int main() {printf("**************************\n");printf(" Very Good!\n");printf("**************************\n");return 0; }?
點評
???????? 很基礎的一道題,主要是熟悉OJ的使用和OJ的出題格式。
PROBLE B
?
?
?
分析
???????? 這個題相比第一題直接輸出來說還多了輸入。需要注意的是樣例不代表程序只有10 20 30.而是其中之一是10 20 30.所有我們要調用scanf來進行輸入。
?????? 怎么求三個數的最大值,其實有很多方法。在這里我就先介紹一種比較直觀的數學方法了(當然應該不是最簡單的,只是感覺比較好懂罷了)。
?????? 假設a,b,c 如果求出a,b的最大值,再求出a,c的最大值,那么不就是求出了a,b,c的最大值?
講解
? ? ? ? ?*下面的方法使用了?運算符請大家去翻一下課本如果有什么不清楚的話,不過也是基礎的語法。這樣可以減少代碼量,當然再后續的學習中,會知道更多的函數來減少這種方法的代碼量,但是這里不再詳細介紹。
代碼
#include <stdio.h> int main() {int a,b,c;scanf("%d %d %d",&a,&b,&c);int k1=(a>b)?a:b;int k2=(a>c)?a:c;int k3=(k1>k2)?k1:k2;printf("%d",k3); }點評
???????? 對于初學者而言可能不是一道輕松的題,但是掌握了這道題的話,說明你已經基本掌握了if的使用方法。
PROBLE C
?
?
?
分析
?????? 這個題說實話開始有點技術含量了,不是直接就能上手去做的。這里用到了循環語句,我在此用的是for,因為for對于計步循環來說還是比較好用的。這個題的難點在于怎么去求解2+22+222+…+22…222(n個2)的值的問題。
講解
???????? 首先看到這種不斷循環相加的情況,首先想到要用循環語句。對于上式的求解,其實經過觀察我們可以發現一種方法。他們都是2*1,2*11,2*111的,那么怎么去實現這種功能呢,我們需要定義兩個變量r,sum(當然其他的字母也可以,這里只是習慣上)。每次循環把r累積乘10再加1即可即r=r*10+1;用sum來進行計數。即sum+=2*r;到此程序的主要部分講解完畢。
代碼
?????? 注意下面sum初始值=2!!!i從1開始循環!!
#include <stdio.h> int main() {int n,r,sum;scanf("%d",&n);r=1;sum=2;for(int i=1;i<n;i++){r=r*10+1;sum+=2*r; } printf("%d",sum); }點評
???????? 這可能是大家第一次做這種與數學相關的題目。其實我感覺這個題是告訴大家,編程跟數學是密切相關的。
PROBLE D
?
?
分析
???????? 這個題雖然只有三個數,但是也透露出了一絲絲排序算法的影子。但是在這里我就先不準備講解排序的一些算法(如冒泡排序)了,直接講解硬來的解法。
講解
???????? 首先我們得知道交換變量的方法,其中一個就是三變量交換法。我們先定義一個t? t=a;a=b;b=t這樣即可交換a和b,為什么要定義一個t來交換而不是直接交換呢,這些還需要你自己思考。那么有了這個交換變量的方法,我們就可以實施我們的方法了。我們進行直接硬來的三個if進行交換。例如if(a>b) { int t=a;a=b;b=t} 這樣交換后就是a<=b了,同理還有(a>c) (b>c)兩個,
?
?
出自紫書《算法競賽入門經典》
詳細請看代碼
代碼
#include <stdio.h> int main() {int a,b,c;scanf("%d %d %d",&a,&b,&c);if(a>b) {int t=a;a=b;b=t;}if(a>c) {int t=a;a=c;c=t;}if(b>c) {int t=b;b=c;c=t;}printf("%d %d %d",a,b,c);return 0; }
點評
???????? 這個題僅僅是三個數比大小如果是4個5個乃至更多的數呢?建議大家自己去學習一下排序的算法,推薦冒泡排序。
PROBLE E
?
?
分析
???????? 這還是一道數學題,題目本身不難解法很多。但是這里出現了循環輸入輸出的問題需要注意。
講解
?????? 循環輸入輸出的基本做法是用一個while函數來實現。這里不得不提一下scanf函數的返回值為輸入正確的元素的個數,到EOF結束指的是end of file,文件末尾。因為oj的判卷是文件輸入文件輸出進行數據的匹配來進行判卷的。oj會把你的程序的輸出文本與答案比對如果全部一致那么恭喜你就是accepted,如果是其他會提示別的情況,再次不詳細說明,看群里文件的入門指南即可。因為要輸入三個值所以需要寫成 while(scanf(“%d %d %d”,&a,&b,&c)==3)
其他的就是判斷三角形的方法,判斷直角三角形的方法,方法很多不再詳細介紹。
詳細請看代碼
代碼
?
#include <stdio.h> int main() {int a,b,c;while(scanf("%d %d %d",&a,&b,&c)==3){if(a+b>c&&a+c>b&&b+c>a){if(a*a+b*b==c*c)printf("yes\n");elseprintf("no\n");}elseprintf("not a triangle\n");}return 0; }如果判斷三角形條件有不熟悉的同學的話,可以看看代碼里的if語句。
點評
?????? 這道題的要點我覺得在于循環輸入和輸出。題目本身而言并不難,只需要多多注意細節即可。
?
? ? ? ?
轉載于:https://www.cnblogs.com/baccano-acmer/p/9716047.html
總結
以上是生活随笔為你收集整理的CONTEST1001 题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ3566 SHOI2014概率充
- 下一篇: 深度学习的batch_size