牛客網_2018年全國多校算法寒假訓練營練習比賽(第一場)_部分題解
阿新 • • 發佈:2018-01-21
運行時間 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 usingView Codenamespace 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 }
比賽首頁 > 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年全國多校算法寒假訓練營練習比賽(第一場)_部分題解