1. 程式人生 > >牛客網_2018年全國多校算法寒假訓練營練習比賽(第一場)_部分題解

牛客網_2018年全國多校算法寒假訓練營練習比賽(第一場)_部分題解

運行時間 can ear 類型 主動 log box 裝配 lap

~__~花了大半個小時水了點題,將究看看。

比賽首頁 > A 大吉大利,今晚吃雞——槍械篇 > 21035827

在絕地求生(吃雞)遊戲裏,不同的槍支有不同的威力,更是可以搭配不同的配件,以提升槍支的性能。 技術分享圖片

每一把槍都有其威力及其可裝備配件種類。每一個配件有其所屬種類,可以為槍支提供威力的百分比加成。每一把槍只能裝備一個同類配件。給你n把槍支和m個配件,槍的威力為p,可裝備的配件數量為k,為k個不同類型的配件,同種類配件只可以裝備一個。配件種類用數字q表示,配件威力加成用一個小數b表示。請你挑選一把槍並為其搭配配件使其威力最大。

假設一把槍的威力是p,裝配的k個配件的威力加成是bi,那麽槍最後的威力w=p*(1+b1+b2+…+bk)。

題目思路:枚舉所有的配件,只統計出每種型號的配件的可提供的最高傷害;然後依次枚舉每種槍械。

技術分享圖片
 1 提交的代碼
 2 
 3 提交時間:2018-01-21 語言:C++ 運行時間: 56 ms 占用內存:3556K 狀態:答案正確
 4 
 5 #include<cstdio>
 6 #include<iostream>    //
 7 #include<cmath>
 8 #include<algorithm>
 9 #include<queue>
10 #include<cstring>    //18:58
11 using
namespace std; 12 #define ll long long 13 struct gun 14 { 15 double power; //g【i】的最高傷害 16 int vt; //配件個數 17 int v[1001]; 18 }g[1001]; 19 struct Sub{ 20 double maxx; 21 } sub[1010]; //配件結構體,sub[i].maxx代表第i個型號配件可以提供的最高傷害加成 22 bool cmp(gun a,gun b){ 23 return a.power>b.power; 24 } 25 int main(){
26 27 int n,m,t;double k; 28 while(scanf("%d%d",&n,&m)!=EOF){ 29 for(int i=1;i<=n;i++){ 30 31 scanf("%lf%d",&g[i].power,&g[i].vt); 32 for(int j=1;j<=g[i].vt;j++){ 33 scanf("%d",&g[i].v[j]); //有的配件數組 34 } 35 } 36 for(int i=1;i<=1000;i++){ 37 sub[i].maxx=0.0; 38 } 39 for(int i=1;i<=m;i++){ //每讀入一次數據進行更新最大值 40 scanf("%d%lf",&t,&k); 41 sub[t].maxx=sub[t].maxx>k?sub[t].maxx:k; 42 } 43 44 for(int i=1;i<=n;i++){ //每個槍械進行更新 45 double mm=0; 46 for(int j=1;j<= g[i].vt;j++) //枚舉每個型號的配件 47 mm+=sub[g[i].v[j]].maxx; 48 g[i].power=g[i].power*(1.0+mm); 49 } 50 51 sort(g+1,g+1+n,cmp); //逆序排序 52 printf("%.4lf\n",g[1].power); 53 } 54 55 56 return 0; 57 }
View Code

比賽首頁 > I 找數字個數 > 21031579

lulu喜歡小於等於1000的正整數,但是如果某個數是a或b的倍數,lulu會討厭這個數。如果某個數裏包含了a和b兩個數裏包含的數,lulu也會討厭。(例如a=14,b=23,如果數字中包含1、2、3、4這四個數中的任意一個數,lulu就會討厭這個數)。現在告訴你a,b,你能說出lulu喜歡的數有多少個麽。

題目分析:水題。@瘋子磊 的思路:可以主動去重,第一遍for(1-》1000)去除a的倍數和b的倍數,第二遍for(1-》1000)去除含a和b的數字的數,然後輸出剩余總數——這樣時間復雜度一般比我的思路要低(極端情況下一樣)。自行嘗試。

技術分享圖片
 1 提交的代碼
 2 
 3 提交時間:2018-01-21 語言:C++ 運行時間: 6 ms 占用內存:484K 狀態:答案正確
 4 
 5 #include<cstdio>
 6 #include<iostream>    //
 7 #include<cmath>
 8 #include<algorithm>
 9 #include<queue>
10 #include<cstring>    //18:58
11 using namespace std;
12 #define ll long long
13 int fact(int i,int a,int b)
14 {
15     int j;
16     int vis1[10]={0},vis2[10]={0};
17     while(i>0){
18         vis1[i%10]=1;i/=10;
19     }
20     while(a>0){
21         vis2[a%10]=1;a/=10;
22     }
23     while(b>0){
24         vis2[b%10]=1;b/=10;
25     }
26     for(j=0;j<=9;j++){
27         if(vis1[j]==vis2[j]&&vis2[j]){
28             return 1;
29         }
30     }
31     return 0;
32 }
33 int main()
34 {
35     int T,a,b,sum;
36     scanf("%d",&T);
37     sum=0;
38     while(T--){
39         scanf("%d%d",&a,&b);
40         sum=1000;
41         for(int i=1;i<=1000;i++){
42                             //一個簡潔的思路,一遍for循環:每次去除a和b的倍數,然後寫一個函數判斷是否含有a和b的本身數字
43             if(i%a==0||i%b==0||fact(i,a,b)){
44                 sum--;
45             }
46         }
47         printf("%d\n",sum);
48     }
49  
50     return 0;
51 }    
View Code

比賽首頁 > H 方塊與收納盒 > 21030126

現在有一個大小n*1的收納盒,我們手裏有無數個大小為1*1和2*1的小方塊,我們需要用這些方塊填滿收納盒,請問我們有多少種不同的方法填滿這個收納盒。

題目分析:基礎一維DP;假設長度為n的時候,狀態轉移方程式為dp[i]=dp[i-1]+dp[i-2]; 即n塊長度是有n-1塊再加一塊拼起的或者n-2塊加兩塊拼起的。或者自行打表分析,分別從1打到10就可以找出規律了。

  

技術分享圖片
#include<cstdio>
#include<iostream>    //
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstring>    //18:58
using namespace std;
#define ll long long
int main()
{
    ll dp[100];
    dp[0]=1;dp[1]=1;
    for(int i=2;i<=80;i++){
        dp[i]=dp[i-1]+dp[i-2];
    }
 
 
    int T,d;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&d);
        printf("%lld\n",dp[d]);
    }
 
    return 0;
}
View Code

牛客網_2018年全國多校算法寒假訓練營練習比賽(第一場)_部分題解