比賽鏈接——點我
F——奇偶交換,G——聚餐,J——LSZ的簽到題 題解鏈接
D——奧里給!,E——yzj學長的即興發揮,I——秤取物體重量 題解鏈接
B題——0和1:
A題——So easy:
題目數據非常小,所以這道題是不卡時間的。就直接dfs遞歸就完了
可能有人會問怎么dfs,那就枚舉每一個寵物的技能。如果概率大於題目要求的k的話就統計一下最小代價就完了
代碼:
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<iostream> 5 using namespace std; 6 const int maxn=55; 7 const int INF=0x3f3f3f3f; 8 int v[maxn],k,n,w[maxn],p[maxn],minn=INF; 9 void dfs(int x,int y) 10 { 11 if(x>=k) 12 { 13 minn=min(minn,y); 14 return; 15 } 16 for(int i=1; i<=n; ++i) 17 { 18 if(v[i]) 19 { 20 v[i]--; 21 dfs(x+w[i],y+p[i]); 22 v[i]++; 23 } 24 } 25 } 26 int main() 27 { 28 scanf("%d%d",&n,&k); 29 for(int i=1; i<=n; ++i) 30 { 31 scanf("%d",&v[i]); 32 } 33 for(int i=1; i<=n; ++i) 34 { 35 scanf("%d",&w[i]); 36 } 37 for(int i=1; i<=n; ++i) 38 { 39 scanf("%d",&p[i]); 40 } 41 dfs(0,0); 42 if(minn==INF) 43 printf("NO\n"); 44 else printf("%d\n",minn); 45 return 0; 46 }
C題——Low||high:
給出的數組q維護的是p序列前綴最大值,要求求出滿足數組q的p序列個數。
根據前綴最大值的性質可以得出一個數從左到右第一次在數組q中出現的位置一定是它在p序列中的位置,而它重復出現的位置在p序列中一定對應比它小且沒有出現過的數。因此我們只需要從左到右遍歷數組q,遇到第一次出現的數就將它填入p序列,遇到重復出現的數就選擇一個比它小且尚未出現的數填入p序列,根據排列,就能算出一共有多少種填法了。
代碼:
1 #include<stdio.h> 2 #define max(a,b) a>b?a:b 3 const long long mod=1000000007; 4 int main() 5 { 6 int t; 7 scanf("%d",&t); 8 while(t--) 9 { 10 int n; 11 scanf("%d",&n); 12 long long ans=1,sum=0,now,bef=0; 13 for(int i=1;i<=n;i++){ 14 scanf("%lld",&now);//直接在輸入的時候計算 15 if(now>bef) sum+=now-bef-1;//記錄有多少個比當前值小且沒出現過的數 16 else ans=(ans*sum--)%mod;//填入一個值,計算排列,未出現過的數數量減一 17 bef=now; 18 } 19 printf("%lld\n",max(ans,0));//結果只可能是非負數 20 } 21 return 0; 22 }
H題——NYOJ動物統計:
題目描述的字典樹部分可以不看(給你說可以用字典樹來做,又沒說必須用它來做)
看一下數據又不大,那就暴力寫唄
直接看代碼吧
代碼:
1 //#include <iostream> 2 //#include <cstdio> 3 //#include <cstring> 4 //#include <cstdlib> 5 //#include <algorithm> 6 //using namespace std; 7 //typedef long long ll; 8 //const int maxn=26; 9 //const int mod=998244353; 10 //typedef struct Trie* TrieNode; 11 #include <cstdio> 12 #include <string.h> 13 int main() 14 { 15 char num[10005][15]; 16 int num_1[10000] = {0}; 17 int max = 0; 18 int count; 19 int count_1; 20 scanf("%d",&count); 21 for (int i = 0; i < count; i++) 22 { 23 scanf("%s",num[i]); 24 for(int j = 0; j <= i; j++) 25 { 26 if(strcmp(num[i], num[j])==0) 27 { 28 num_1[i]++; 29 } 30 } 31 } 32 for (int i =0; i < count; i++) 33 { 34 if( max < num_1[i]) 35 { 36 max = num_1[i]; 37 count_1 = i; 38 } 39 } 40 // FILE *fp=NULL; 41 // fp=fopen("4.txt","w"); 42 printf("%s %d",num[count_1],max); 43 //fclose(fp); 44 return 0; 45 }