T06 笨小猴
描述
笨小猴的詞匯量很小,所以每次做英語選擇題的時候都很頭疼。但是他找到了一種方法,經試驗證明,用這種方法去選擇選項的時候選對的幾率非常大!
這種方法的具體描述如下:假設maxn是單詞中出現次數最多的字母的出現次數,minn是單詞中出現次數最少的字母的出現次數,如果maxn-minn是一個質數,那么笨小猴就認為這是個Lucky Word,這樣的單詞很可能就是正確的答案。
輸入
只有一行,是一個單詞,其中只可能出現小寫字母,並且長度小於100。
輸出
共兩行,第一行是一個字符串,假設輸入的的單詞是Lucky Word,那么輸出“Lucky Word”,否則輸出“No Answer”;
第二行是一個整數,如果輸入單詞是Lucky Word,輸出maxn-minn的值,否則輸出0。

樣例輸入 樣例 #1: error 樣例 #2: olympic 樣例輸出 樣例 #1: Lucky Word 2 樣例 #2: No Answer 0
本題原來提示中的第二行有錯誤。
統計所有的字符出現的次數,sort排序,第一個非0的元素是最小值,第26個是最大值,然后判斷是否為質數,注意0和1要特判

1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 int a[30]; 6 char b[101]; 7 int main() 8 { 9 cin>>b; 10 for(int i=0;i<strlen(b);i++) 11 a[b[i]-96]++; 12 sort(a+1,a+27); 13 int k; 14 for(int i=1;i<=26;i++) 15 if(a[i]!=0) 16 { 17 k=a[i]; 18 break; 19 } 20 int c=a[26]-k; 21 if(c==1||c==0) 22 { 23 cout<<"No Answer"<<endl<<0; 24 return 0; 25 } 26 for(int i=2;i*i<=c;i++) 27 if(c%i==0) 28 { 29 cout<<"No Answer"<<endl<<0; 30 return 0; 31 } 32 cout<<"Lucky Word"<<endl<<c; 33 }
07:不與最大數相同的數字之和
描述
輸出一個整數數列中不與最大數相同的數字之和。
輸入
輸入分為兩行:
第一行為N(N為接下來數的個數,N <= 100);
第二行為N個整數,數與數之間以一個空格分開,每個整數的范圍是-1000,000到1000,000。
輸出
輸出為N個數中除去最大數其余數字之和。

樣例輸入 3 1 2 3 樣例輸出 3
在讀入時記錄最大值,還要記錄有幾個,最后用n個數的和減去

1 #include<iostream> 2 using namespace std; 3 int sum,maxx,m; 4 int main() 5 { 6 int n,x; 7 cin>>n; 8 for(int i=1;i<=n;i++) 9 { 10 cin>>x; 11 sum+=x; 12 if(x>maxx) maxx=x,m=1; 13 else if(x==maxx) m++;//前面有else,不用擔心最大值在if加了一次,在這兒又加了一次 14 } 15 cout<<sum-m*maxx; 16 }
T08 白細胞計數
描述
醫院采樣了某臨床病例治療期間的白細胞數量樣本n份,用於分析某種新抗生素對該病例的治療效果。為了降低分析誤差,要先從這n份樣本中去除一個數值最大的 樣本和一個數值最小的樣本,然后將剩余n-2個有效樣本的平均值作為分析指標。同時,為了觀察該抗生素的療效是否穩定,還要給出該平均值的誤差,即所有有 效樣本(即不包括已扣除的兩個樣本)與該平均值之差的絕對值的最大值。
現在請你編寫程序,根據提供的n個樣本值,計算出該病例的平均白細胞數量和對應的誤差。
輸入
輸入的第一行是一個正整數n(2 < n <= 300),表明共有n個樣本。
以下共有n行,每行為一個浮點數,為對應的白細胞數量,其單位為10^9/L。數與數之間以一個空格分開。
輸出
輸出為兩個浮點數,中間以一個空格分開。分別為平均白細胞數量和對應的誤差,單位也是10^9/L。計算結果需保留到小數點后2位。

樣例輸入 5 12.0 13.0 11.0 9.0 10.0 樣例輸出 11.00 1.00
注意計算最大誤差時,不要直接如果是最大值或最小值就排除,有可能出現兩個相同的最值,應該保留一個

1 #include<iostream> 2 #include<cmath> 3 #include<algorithm> 4 #include<cstdio> 5 using namespace std; 6 bool ok1,ok2; 7 double a[1001]; 8 double minn=0x7fffffff,maxx,sum; 9 double ans; 10 int main() 11 { 12 int n; 13 double x; 14 cin>>n; 15 for(int i=1;i<=n;i++) 16 { 17 cin>>x; 18 a[i]=x; 19 sum+=x; 20 if(x>maxx) maxx=x; 21 if(x<minn) minn=x; 22 } 23 double m=(sum-maxx-minn)/(n-2); 24 printf("%.2lf",m); 25 printf(" "); 26 for(int i=1;i<=n;i++) 27 { 28 if(a[i]==minn&&!ok1) //只continue掉一個極值 29 { 30 ok1=true;continue; 31 } 32 if(a[i]==maxx&&!ok2) 33 { 34 ok2=true;continue; 35 } 36 ans=max(ans,abs(a[i]-m)); 37 } 38 printf("%.2lf",ans); 39 }
開始得了8分,錯誤代碼:
for(int i=1;i<=n;i++) { if(a[i]==minn) continue; if(a[i]==maxx) continue;
忽略了極值有>=2個的情況。例3,3,4,4,只continue一個3.一個4
T09 直方圖
描述
給定一個非負整數數組,統計里面每一個數的出現次數。我們只統計到數組里最大的數。
假設 Fmax (Fmax < 10000)是數組里最大的數,那么我們只統計 {0,1,2.....Fmax} 里每個數出現的次數。
輸入
第一行n是數組的大小。1 <= n <= 10000。
緊接着一行是數組的n個元素。
輸出
按順序輸出每個數的出現次數,一行一個數。如果沒有出現過,則輸出0。
對於例子中的數組,最大的數是3,因此我們只統計{0,1,2,3}的出現頻數。

樣例輸入 5 1 1 2 3 1 樣例輸出 0 3 1 1

1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int n,sum[10001],x,maxx; 5 int main() 6 { 7 cin>>n; 8 for(int i=1;i<=n;i++) 9 { 10 scanf("%d",&x); 11 sum[x]++; 12 if(x>maxx) maxx=x; 13 } 14 for(int i=0;i<=maxx;i++) 15 printf("%d\n",sum[i]); 16 }
T10 找最大數序列
描述
輸入n行,每行不超過100個無符號整數,無符號數不超過4位。請輸出最大整數以及最大整數所在的行號(行號從1開始)。如果該數據在多個行中出現,則按從小到大輸出相應行號,行號之間以一個逗號分開。
輸入
一行輸入一個正整數n(n <= 30)。
之后的n行,每行包含不超過100個無符號整數,整數之間以一個逗號分開。
輸出
第一行:最大整數;
第二行:最大整數所在的行編號,逗號間隔。

樣例輸入 6 1,3,5,23,6,8,14 20,22,13,4,16 23,12,17,22 2,6,10,9,3,6 22,21,20,8,10 22,1,23,6,8,19,23 樣例輸出 23 1,3,6
本題的讀入方式有好幾種。
1、按字符串把一行讀進去,再根據逗號斷開。
2、一個字符一個字符的讀。
以下是第二種方法,讀入方法思路來源於讀入優化。

1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 int n,h,x,sl=1,l=1; 6 int ans[3001],sum,maxn=-1; 7 char c; 8 int a[31][102]; 9 void init()//修改的讀入優化 10 { 11 c=getchar(); 12 while(h<=n) 13 { 14 if(c=='\n') 15 { 16 if(h) 17 { 18 a[h][l]=x; 19 a[h][l+1]=99999; 20 x=0; 21 } 22 h++; 23 l=1; 24 if(h<=n) 25 c=getchar(); 26 continue; 27 } 28 if(c==',') 29 { 30 a[h][l]=x; 31 l++; 32 x=0; 33 c=getchar(); 34 continue; 35 } 36 while(c>='0'&&c<='9') 37 { 38 x=x*10+c-'0'; 39 c=getchar(); 40 } 41 } 42 } 43 int main() 44 { 45 cin>>n; 46 init(); 47 for(int i=1;i<=n;i++) 48 { 49 int j=1; 50 while(a[i][j]!=99999) 51 { 52 if(a[i][j]==maxn&&ans[sum]!=i)//一行里可能有好幾個最大數,但只能輸出一個,所以ans【sum】!=i 53 ans[++sum]=i; 54 else if(a[i][j]>maxn) 55 { 56 sum=0; 57 ans[++sum]=i; 58 maxn=a[i][j]; 59 } 60 j++; 61 } 62 } 63 cout<<maxn<<endl; 64 for(int i=1;i<sum;i++) cout<<ans[i]<<','; 65 cout<<ans[sum]; 66 }
第二種方法的另一種代碼參照鏈接,來源:myj
T11 連續出現的字符
描述
給定一個字符串,在字符串中找到第一個連續出現至少k次的字符。
輸入
第一行包含一個正整數k,表示至少需要連續出現的次數。1 <= k <= 1000。
第二行包含需要查找的字符串。字符串長度在1到1000之間,且不包含任何空白符。
輸出
若存在連續出現至少k次的字符,輸出該字符;否則輸出No。

樣例輸入 3 abcccaaab 樣例輸出 c

1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 char a[1001]; 5 int n,now=1; 6 using namespace std; 7 int main() 8 { 9 cin>>n; 10 cin>>a; 11 if(n==1) 12 { 13 cout<<a[0]; 14 return 0; 15 } 16 for(int i=1;i<strlen(a);i++) 17 { 18 if(a[i]==a[i-1]) now++; 19 else now=1; 20 if(now==n) 21 { 22 cout<<a[i]; 23 return 0; 24 } 25 } 26 cout<<"No"; 27 }
T12 最長平台
描述
已知一個已經從小到大排序的數組,這個數組的一個平台(Plateau)就是連續的一串值相同的元素,並且這一串元素不能再延伸。例如,在 1,2,2,3,3,3,4,5,5,6中1,2-2,3-3-3,4,5-5,6都是平台。試編寫一個程序,接收一個數組,把這個數組最長的平台找出 來。在上面的例子中3-3-3就是最長的平台。
輸入
第一行有一個整數n(n <= 1000),為數組元素的個數。第二行有n個整數,整數之間以一個空格分開。
輸出
輸出最長平台的長度。

樣例輸入 10 1 2 2 3 3 3 4 5 5 6 樣例輸出 3

#include<cstdio> #include<iostream> #include<cstring> int n,now=1,maxn=1,x,last; using namespace std; int main() { cin>>n; cin>>last; for(int i=2;i<=n;i++) { scanf("%d",&x); if(x==last) now++; else now=1; if(now>maxn) maxn=now; last=x; } cout<<maxn; }
T13 整數去重
描述
給定含有n個整數的序列,要求對這個序列進行去重操作。所謂去重,是指對這個序列中每個重復出現的數,只保留該數第一次出現的位置,刪除其余位置。
輸入
輸入包含兩行:
第一行包含一個正整數n(1 <= n <= 20000),表示第二行序列中數字的個數;
第二行包含n個整數,整數之間以一個空格分開。每個整數大於等於10、小於等於100。
輸出
輸出只有一行,按照輸入的順序輸出其中不重復的數字,整數之間用一個空格分開。

樣例輸入 5 10 12 93 12 75 樣例輸出 10 12 93 75

1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 int n,now=1,maxn=1; 5 int a[20001]; 6 bool v[101]; 7 using namespace std; 8 int main() 9 { 10 cin>>n; 11 for(int i=1;i<=n;i++) 12 { 13 scanf("%d",&a[i]); 14 if(!v[a[i]]) 15 { 16 v[a[i]]=true; 17 cout<<a[i]<<' ' ; 18 } 19 } 20 }
T 14鋪地毯
描述
為了准備一個獨特的頒獎典禮,組織者在會場的一片矩形區域(可看做是平面直角坐標系的第一象限)鋪上一些矩形地毯。一共有n張地毯,編號從1到n。現在將這些地毯按照編號從小到大的順序平行於坐標軸先后鋪設,后鋪的地毯覆蓋在前面已經鋪好的地毯之上。地毯鋪設完成后,組織者想知道覆蓋地面某個點的最上面的那張地毯的編號。注意:在矩形地毯邊界和四個頂點上的點也算被地毯覆蓋。
輸入輸出樣例1說明:如下圖,1號地毯用實線表示,2號地毯用虛線表示,3號用雙實線表示,覆蓋點(2,2)的最上面一張地毯是3號地毯。
輸入輸出樣例2說明:如下圖,1號地毯用實線表示,2號地毯用虛線表示,3號用雙實線表示,覆蓋點(4,5)的最上面一張地毯是3號地毯。
輸入
輸入共n+2行。
第一行,一個整數n,表示總共有n張地毯。
接下來的n行中,第i+1行表示編號i的地毯的信息,包含四個正整數a,b,g,k,每兩個整數之間用一個空格隔開,分別表示鋪設地毯的左下角的坐標(a,b)以及地毯在x軸和y軸方向的長度。
第n+2行包含兩個正整數x和y,表示所求的地面的點的坐標(x,y)。
對於30%的數據,有n≤2;
對於50%的數據,0≤a, b, g, k≤100;
對於100%的數據,有0≤n≤10,000,0≤a, b, g, k≤100,000。
輸出
輸出共1行,一個整數,表示所求的地毯的編號;若此處沒有被地毯覆蓋則輸出-1。

樣例輸入 樣例 #1: 3 1 0 2 3 0 2 3 3 2 1 3 3 2 2 樣例 #2: 3 1 0 2 3 0 2 3 3 2 1 3 3 4 5 樣例輸出 樣例 #1: 3 樣例 #2: -1
倒着往前找

1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int n,x,y; 5 int a[10001],b[10001],g[10001],k[10001]; 6 int main() 7 { 8 scanf("%d",&n); 9 for(int i=1;i<=n;i++) 10 scanf("%d%d%d%d",&a[i],&b[i],&g[i],&k[i]); 11 scanf("%d%d",&x,&y); 12 for(int i=n;i>=1;i--) 13 { 14 if(x>=a[i]&&x<=a[i]+g[i]&&y>=b[i]&&y<=b[i]+k[i]) 15 { 16 cout<<i; 17 return 0; 18 } 19 } 20 cout<<-1; 21 }
T15 接水問題
描述
學校里有一個水房,水房里一共裝有 m 個龍頭可供同學們打開水,每個龍頭每秒鍾的供水量相等,均為 1。
現在有 n 名同學准備接水,他們的初始接水順序已經確定。將這些同學按接水順序從 1 到 n 編號,i號同學的接水量為 wi。接水開始時,1 到 m 號同學各占一個水龍頭,並同時打開水龍頭接水。當其中某名同學 j 完成其接水量要求 wj后,下一名排隊等候接水的同學 k 馬上接替 j 同學的位置開始接水。這個換人的過程是瞬間完成的,且沒有任何水的浪費。即 j 同學第 x 秒結束時完成接水,則 k 同學第 x+1 秒立刻開始接水。 若當前接水人數 n’不足 m,則只有 n’個龍頭供水,其它 m-n’個龍頭關閉。
現在給出 n 名同學的接水量,按照上述接水規則,問所有同學都接完水需要多少秒。
輸入
第 1 行2 個整數 n 和 m,用一個空格隔開,分別表示接水人數和龍頭個數。
第 2 行 n 個整數 w1、w2、……、wn,每兩個整數之間用一個空格隔開,wi表示 i 號同學的接水量。
1 ≤ n ≤ 10000,1 ≤ m ≤ 100 且 m ≤ n;
1 ≤ wi ≤ 100。
輸出
輸出只有一行,1 個整數,表示接水所需的總時間。

樣例輸入 樣例 #1: 5 3 4 4 1 2 1 樣例 #2: 8 4 23 71 87 32 70 93 80 76 樣例輸出 樣例 #1: 4 樣例 #2: 163
利用優先隊列,將其轉化為小根堆,前m個先存進去,每次取出隊首元素加上下一個再存進去,最后一只清空隊列,最后一個數即為答案

1 #include<iostream> 2 #include<queue> 3 #include<cstdio> 4 using namespace std; 5 priority_queue<int,vector<int>,greater<int> >p;//轉化為小根堆 6 int n,m,x,ans; 7 int main() 8 { 9 scanf("%d%d",&n,&m); 10 for(int i=1;i<=m;i++) 11 { 12 scanf("%d",&x); 13 p.push(x); 14 } 15 for(int i=m+1;i<=n;i++) 16 { 17 scanf("%d",&x); 18 int t=p.top(); 19 p.pop(); 20 t+=x; 21 p.push(t); 22 } 23 while(!p.empty()) 24 { 25 ans=p.top(); 26 p.pop(); 27 } 28 printf("%d",ans); 29 }