(noi.openjudge.cn) 1.9編程基礎之順序查找T06——T15


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 }
View Code

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 }
View Code

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 }
View Code

開始得了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 }
View Code
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 }
View Code

第二種方法的另一種代碼參照鏈接,來源: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 } 
View Code

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;
} 
View Code

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 } 
View Code

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。

樣例輸入
樣例 #13
1 0 2 3
0 2 3 3
2 1 3 3
2 2

樣例 #23
1 0 2 3
0 2 3 3
2 1 3 3
4 5
樣例輸出
樣例 #13

樣例 #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 }
View Code

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 個整數,表示接水所需的總時間。

樣例輸入
樣例 #15 3
4 4 1 2 1

樣例 #28 4
23 71 87 32 70 93 80 76
樣例輸出
樣例 #14

樣例 #2163
樣例

利用優先隊列,將其轉化為小根堆,前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 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM