c語言巧題
只有一個簡單的思路,一起討論一下:
第1個小孩給他一個(誰讓他搶在前面呢:)
後面的小孩依次按規矩來,看應該給幾個,可愛值高呢,就加一塊,否則就減一塊。
如果發現減到零了,那就倒回去,前面的人補一塊。當然,不是全部補,只要補發到可愛值較高的地方就可以了。實際只需要計算一個總數,所以可以預先算好,直接加到總數中就行了。
開始時,第1個小孩1塊糖,待補發的數量=0
第2個小孩先給2塊糖,由於可愛值開始變高,待補發的數量=1
每3個小孩先給1塊糖,由於可愛值變低,待補發的數量+1。
第4個小孩可愛值變低,待補發總數+1,照說應該給0塊糖,當然不行,補發一塊,前面的也都補一塊,補3塊。這個待補發數量還不能歸零。當前第4個小孩的糖數應該修正成1。
第5個小孩給2塊糖,由於可愛值開始變高,補發數量歸零=1。
1+2+1+0+(3)+2=9
大體的思路應該就是這個樣子。
② C語言經典題目
1.正確的演算法:
如果n=3, 過河時間為A+B+C
如果n<=2, 好算, 不費口舌了
如果n>=4, 這個是重點:
每次優先考慮把最慢兩人送過河
把n人中最快兩人記為A,B, 最慢兩人記為C,D(過河時間A<B<C<D), n人問題實質上轉換為4人過河問題, 參考到4人過河時的優化,
記AB過河, A回, CD過河, B回, 為方法X, 實質是利用最快兩人進行優化, 耗時A+2B+D
記AD過河, A回, AC過河, A回, 為方法y, 實質是利用最快一人來過河, 耗時2A+C+D
每次比較這兩個方法, 如果x快, 使用x方法, 如果y快, 則用y, 並且, 一旦某次使用y方法後, 以後都不用比較了, 全部使用y方法過河
2.演算法正確性證明:
為什麼每次先讓最慢兩人過河? 因為他們遲早要過河...早過晚過一樣, 而晚過的話, 有可能時間不能被優化, 所以選擇最先過
為什麼是兩人, 不是三人? 因為這船一次只能兩人, 三人問題和兩人問題的優化一樣, 所以一次考慮三人毫無意義, 同理, 三人以上不加考慮
為什麼某次用y過河後不用再比較xy了?
先看這個例子:
1 99 100 101
用x方法是99+1+101+99= 300
y方法是 101+1+100+1 = 203
y比x快的原因是2A+C+D < A+2B+D, 即 A+C<2B
容易想到, 從此以後A+C都會小於2B了(因為C越來越小)
3.補充:
演算法分析就到這里了, 至於具體的程序...樓主既然是ACMer, 這個應該不困難
當然, 如果樓主需要的話, 也可以給出程序
③ 一道c語言的題目:計算a、b之間所有奇數的和
一、演算法分析:
要計算a b之間所有奇數和,那麼最樸素的演算法可以設計如下:
1、輸入a,b值;
2、循環遍歷a b之間的所有數值,如果為奇數,則累加;
3、輸出結果。
二、演算法優化:
1、由於連續奇數之間差值為2,所以可以判斷出第一個奇數,然後依次加2得到所有奇數,將所有奇數累加即可。
2、連續奇數屬於等差數列,所以可以利用等差數列求和公式,更快捷的得到結果。
三、參考代碼:
1、原始演算法代碼:
#include<stdio.h>
intadd(inta,intb)
{
intm,n,s=0;
if(a<b)m=a,n=b;
elsem=b,n=a;//判斷ab大小,增加健壯性。
for(;m<=n;m++)
if(m%2==1)s+=m;//判斷並累加奇數。
returns;//返回結果。
}
intmain()
{
inta,b;
scanf("%d%d",&a,&b);//輸入a,b值。
printf("%d ",add(a,b));//計算並輸出結果。
return0;
}
2、優化演算法1:
#include<stdio.h>
intadd(inta,intb)
{
intm,n,s=0;
if(a<b)m=a,n=b;
elsem=b,n=a;//判斷ab大小,增加健壯性。
if(m%2==0)m+=1;//找到第一個奇數。
for(;m<=n;m+=2)//僅遍歷奇數。
s+=m;//累加奇數。
returns;//返回結果。
}
intmain()
{
inta,b;
scanf("%d%d",&a,&b);//輸入a,b值。
printf("%d ",add(a,b));//計算並輸出結果。
return0;
}
3、優化演算法2:
#include<stdio.h>
intadd(inta,intb)
{
intm,n,s=0;
if(a<b)m=a,n=b;
elsem=b,n=a;//判斷ab大小,增加健壯性。
if(m%2==0)m+=1;//找到第一個奇數。
if(n%2==0)n-=1;//找到最後一個奇數。
s=(m+n)*((n-m)/2+1)/2;//根據等差數列求和公式計算和。
returns;//返回結果。
}
intmain()
{
inta,b;
scanf("%d%d",&a,&b);//輸入a,b值。
printf("%d ",add(a,b));//計算並輸出結果。
return0;
}
④ c語言題目:乒乓球比賽
太強大了,
#include "stdio.h"
void main()
{
char i,j,k;/*i是a的對手,j是b的對手,k是c的對手*/
for(i='x';i<='z';i++)//i有三種對陣情況x-a,y-a,z-a,用循環遍歷
for(j='x';j<='z';j++)//j有三種對陣情況x-b,y-b,z-b,用循環遍歷
{
if(i!=j)//表示i 、j 不能為x,y,z三人中的同一個人
for(k='x';k<='z';k++)//k有三種對陣情況x-c,y-c,z-c,用循環遍歷
{
if(i!=k&&j!=k)//表示k、i、j不能為x,y,z三人中的同一個人
{
if(i!='x'&&k!='x'&&k!='z')//此乃題目條件:A說他不和X比(a!=x),而i 又非跟a比,所以i!='x';C說他不和X、Z比。即:i!='x'且k!='x'且k!='z'(同理)
printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);//經過以上排列,選擇,最終確定對手組合
}
}
}
}