賽碼解題報告(五)

攔截導彈


題目描述

某國進行軍事演戲,研發一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於等於前一發的高度。某天,雷達捕捉到敵國導彈來襲。由於該系統還在試用階段,所以只用一套系統,因此有可能不能攔截所有的導彈。請你幫忙選擇一套系統,根據測試的導彈數量和每次導彈飛來的高度,計算出最多能攔截導彈的數目。

輸入

第一行輸入測試數據組數N(1<=N<=10)

接下來一行輸入這組測試數據共有多少個導彈m(1<=m<=20)

接下來行輸入導彈依次飛來的高度,所有高度值均是大於0的正整數。


樣例輸入

2

8

389 207 155 300 299 170 158 65

3

88 34 65


輸出

輸出最多能攔截的導彈數目


樣例輸出

6

2


本題最初有點亂,注意理清思路,可以看作動態規劃來做,dp[j]代表到第j個子彈時最長下降自序列長度,
對於每一個元素,考慮其後面所有的元素,如果後面元素的高度小於它且後面元素的長度小於當前元素+1則對其進行更新。。
#include<stdio.h>
int main(){
    int n,m;
    int a[21];
    int dp[21];
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&m);
        for(int j=1;j<=m;j++)
            scanf("%d",&a[j]);
        for(int j=1;j<=m;j++)
            dp[j]=1;
        for(int j=1;j<=m;j++){
                for(int k=j+1;k<=m;k++){
            if(a[k]<a[j]){
                if(dp[k]<dp[j]+1)
                dp[k]=dp[j]+1;


            }
        }
        }
        int maxx=dp[1];
        for(int j=1;j<=m;j++){
            if(dp[j]>maxx)
                maxx=dp[j];
        }
        printf("%d\n",maxx);
    }
    return 0;
}

商隊運輸費


題目描述

很久以前,某王國擁有 n 個大城市,爲了方便交通,國王下令修建了大量的用於連接首都和其他各大城市高速路。

爲節省經費,王國採用了一套優秀的修建方案,使得任何一個大城市都能從首都直接或者通過其他大城市間接到達。並且,如果不重複經過大城市,從首都到達每個大城市的方案都是唯一的。

G商隊是王國重要的運輸商隊,他們奔波於各大城市之間,爲王國的人們運輸商品,實現長途貿易。所以,從一個城市馬不停蹄地到另一個城市成了G商隊最常做的事情。他們有一個錢袋,用於存放往來城市間的運輸費。

在運輸過程中G商隊發現,如果不在某個城市停下來休整,在連續行進過程中,他們所花的運輸費與他們已走過的距離有關,在走第x千米到第x+1千米這一千米中(x是整數),他們花費的運輸費是x+10這麼多。也就是說走1千米花費11,走2千米要花費23。

G商隊想知道:他們從某一個城市出發,如果中間不休息,到達另一個城市,所有可能花費的運輸費中最多是多少呢?


輸入

輸入的第一行包含一個整數n,表示包括首都在內的王國的城市數

城市從1開始依次編號,1號城市爲首都。

接下來n-1行,描述王國的高速路(王國的高速路一定是n-1條)

每行三個整數Pi, Qi, Di,表示城市Pi和城市Qi之間有一條高速路,長度爲Di千米。輸入城市數(〈10),長度(〈=100)


樣例輸入

5

1 2 2

1 3 1

2 4 5

2 5 4


輸出

輸出一個整數,表示G商隊最多花費的運輸費是多少。


樣例輸出

135



本題是用弗洛伊德求圖中所有點到之間的最短距離,然後取其中最大的距離即可。

#include<stdio.h>
#include<string.h>
int main(){
    int n;
    int a[11][11];
    int distance[11][11];


    scanf("%d",&n);
    int x,y,z;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            distance[i][j]=5000;
    }
    for(int i=1;i<=n;i++){
        distance[i][i]=0;
    }
    for(int i=0;i<n-1;i++){
        scanf("%d %d %d",&x,&y,&z);
        distance[x][y]=z;
        distance[y][x]=z;
    }


    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                //printf("%d %d\n",distance[i][k],a[k][j]);
                if(distance[i][k]!=5000&&distance[k][j]!=5000&&distance[i][k]+distance[k][j]<distance[i][j])
                    distance[i][j]=distance[i][k]+distance[k][j];
            }
        }
    }
    int maxx=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(distance[i][j]>maxx&&distance[i][j]!=5000)
                maxx=distance[i][j];
        }


    }
    int sum=0;
    int c=11;
    while(maxx-->0){
        sum+=c;
        c++;
    }
    printf("%d\n",sum);
}


向量表示

題目描述

小B所在的團隊正在開發一個WEB輸入內容相似性檢測應用,她想到的一種方法是統計用戶輸入內容中不同單詞的出現頻率,據此建立一個向量表示用戶輸入的內容。

用戶輸入的內容已經經過過濾處理,只剩下單詞和空格,沒有標點符號。

各個單詞出現頻率按從小到大的順序排列後,即構成了用戶輸入內容的向量表示。

由於用戶輸入的內容可能很長,單靠人力完全無法找出來。因此小B希望你能幫忙編寫一個程序,輸出用戶內容的向量表達。


輸入

輸入包括若干行文本數據,每行表示一個用戶輸入文檔。一行文本由單詞和空格組成,單詞之間由空格分隔,最多不超過10000個ASCII碼字符。


樣例輸入

a bd a d
b abc b a a

輸出

對於每個用戶輸入文檔,輸出一行向量表示,數值之間用空格分隔。

樣例輸出

1 1 2

1 2 2

本題肯定用map做比較簡單。
但是仍需注意對應的方法~
import java.util.*;


public class Main{
  public static void main(String[] args) {
Scanner cin = new Scanner(System.in);


while (cin.hasNext()) {
 String line = cin.nextLine();
 String[] words = line.split(" ");
 Map<String,Integer> map = new HashMap<String, Integer>();
 for (int i = 0; i < words.length; i++) {
 String key = words[i];
 if(map.containsKey(key)){
 int value = map.get(key);
 map.put(key, value+1);
 }else{
 map.put(key, 1);
 }
 }
 List<Integer> valueList = new ArrayList<Integer>(map.values());
 Collections.sort(valueList);
 String result = valueList.toString().replace(" ", "").replace("[", "").replace("]", "").replace(",", " ");
 System.out.println(result);
}


cin.close();
}
}


組合概率


題目描述

某生產零件的工廠爲方便管理場內生產的零件種類,現將他們生產的零件從低等到高等零件排序,序號分別爲1,2..n,已知該廠的任意幾個低等的零件可以組合成更高等的零件,零件的序號代表了零件的等級,比如5號零件可以由1號和4號零件組合而成,也可以有2號和3號零件組合而成。

現有一個序號爲 x 的零件,它是由 n 個序號在[a,b]區間內的零件組合而成,求n 個序號在[a,b]區間內的零件組合爲 x 零件的概率


輸入

一行輸入四個整數依次爲n,a,b,x,用空格分隔。數據規模和約定

  對於50%的數據,n≤5.

對於100%的數據,n≤100,b≤100.


樣例輸入

2 1 3 4


輸出

輸出一行爲組合爲 x 零件的概率,小數點後保留四位小數。




本題用遞歸下降的方法來求共有多少種可能,
#include<iostream>
using namespace std;


int zuhe(int n,int m){
  int ret=1;
  while(m--){
    ret*=n;
  }
  return ret;
}
int fun(int a,int b,int x,int n){
  if(x==0&&n==0)
    return 1;
  if(n==0)
    return 0;
  int count=0;
  int temp=a;
  while(temp<=b){
    if(x<temp)
      break;
      count+=fun(a,b,x-temp,n-1);
    ++temp;
  }
  return count;
}


int main(){
  int n,a,b,x;
  while(cin>>n>>a>>b>>x){
    int count=fun(a,b,x,n);
    float p=count*1.0/zuhe(b-a+1,n);
    printf("%.4f",p);
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章