第七周周赛题解
比赛链接——点我
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 }