牛客练习赛23-A/B/C/D/F
正文
https://www.nowcoder.com/acm/contest/156#question
链接:https://www.nowcoder.com/acm/contest/156/A
来源:牛客网
题目描述
紧张刺激的世界杯正在进行中(在托米的世界线里),欧洲人托米沉迷于赌球无法自拔。
托米的口袋里有 100 元,50元,20元,10元,5元,2元,1元的纸币,50分,20分,10分,5分,2分,1分的硬币各无限个。
托米计划买下几注 a 元 b 分的彩票,他希望能支出的纸票数量和硬币数量之和最小,他希望你帮助他完成这个任务。同时由于彩票亭不支持找零,托米希望他的支出恰好等于 a 元 b 分
托米的口袋里有 100 元,50元,20元,10元,5元,2元,1元的纸币,50分,20分,10分,5分,2分,1分的硬币各无限个。
托米计划买下几注 a 元 b 分的彩票,他希望能支出的纸票数量和硬币数量之和最小,他希望你帮助他完成这个任务。同时由于彩票亭不支持找零,托米希望他的支出恰好等于 a 元 b 分
输入描述:
第一行输入一个正整数 T下面 T 行每行两个整数 a,b
输出描述:
每行输出 13 个正整数 n1
...n13
, 对应题面顺序给出最小化支出纸票数量和硬币数量之和的情况下,每种货币的使用次数,如果有多种方案,输出字典序最大的一种,注意这里字典序是依次比较n1到n13,而不是简单的把 13 个正整数拼接在一起
备注:
T=100,0≤ a≤ 109
, 0≤ b<100
贪心就好了,很经典的题目,把分也换算成元然后乘上100倍,这样一遍扫过去就好了。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int coin[20]; 4 int A[20]={10000,5000,2000,1000,500,200,100,50,20,10,5,2,1}; 5 int main(){ 6 long long a,b,t,i,j,k; 7 cin>>t; 8 while(t--){ 9 scanf("%lld%lld",&a,&b); 10 a*=100; 11 a+=b; 12 memset(coin,0,sizeof(coin)); 13 for(i=0;i<13;++i){ 14 coin[i]=a/A[i]; 15 a-=a/A[i]*A[i]; 16 } 17 for(i=0;i<13;++i) printf("%d%c",coin[i],i==12?'\n':' '); 18 } 19 return 0; 20 }
链接:https://www.nowcoder.com/acm/contest/156/B
来源:牛客网
题目描述
欧洲人托米非常喜欢数字,他经常在空闲时玩下面的游戏
对于一个数字 n, 托米会随性选中一个数 p, (1 < p <= n), 将 n 拆分成
,v=n-u,并对 u,v 重复这个过程,直到他有了 n 个 1
1317 为了挑战托米,在每次托米进行划分时,会给托米奖励 u * v 的分数,托米希望你能帮他最大化他的得分。
对于一个数字 n, 托米会随性选中一个数 p, (1 < p <= n), 将 n 拆分成
1317 为了挑战托米,在每次托米进行划分时,会给托米奖励 u * v 的分数,托米希望你能帮他最大化他的得分。
输入描述:
第一行一个正整数 T下面 T 行每行一个正整数 n
输出描述:
对于每组数据,输出托米的最大得分
备注:
T≤ 104
, n≤ 109
观察后发现答案就是前n-1个正整数的和。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main(){ 4 long long t,n; 5 cin>>t; 6 while(t--){ 7 scanf("%lld",&n); 8 n--; 9 printf("%lld\n",(1+n)*n/2); 10 } 11 return 0; 12 }
链接:https://www.nowcoder.com/acm/contest/156/C
来源:牛客网
题目描述
托米完成了1317的上一个任务,十分高兴,可是考验还没有结束
说话间1317给了托米 n 个自然数 a1... an, 托米可以选出一些带回家,但是他选出的数需要满足一些条件
设托米选出来了k 个数 b1,b2... bk, 设这个数列 b 的给值为 b 中所有数按位与的结果,如果你能找到一个整除 b 的最大的 2v,(v≥ 0), 则设定 v 为这个数列的给价,如果不存在这样的 v,则给价值为 -1, 1317 希望托米在最大化给价的情况下,最大化 k
说话间1317给了托米 n 个自然数 a1... an, 托米可以选出一些带回家,但是他选出的数需要满足一些条件
设托米选出来了k 个数 b1,b2... bk, 设这个数列 b 的给值为 b 中所有数按位与的结果,如果你能找到一个整除 b 的最大的 2v,(v≥ 0), 则设定 v 为这个数列的给价,如果不存在这样的 v,则给价值为 -1, 1317 希望托米在最大化给价的情况下,最大化 k
输入描述:
第一行输入一个整数 n, 第二行输入 a1
...an
输出描述:
第一行输出最大的整数 k, 第二行输出 k 个整数 b1
... bk
, 按原数列的相对顺序输出 (如果行末有额外空格可能会格式错误)
备注:
n≤ 105
, a1
... an < 231
从大到小来枚举v,如果遇到当前的v可行,直接break输出就好了。在判断v是否可行的时候,
我们只要选出所有二进制的第v位是1的数,然后判断一下这些数后面v-1位的&是否为0即可。如
果第v位为0,要想保证结果成立那么前面必然要有一位&之后能为1,如果存在的话显然v可以更大,
这就自相矛盾了,所以我们不必考虑第v位不为1的数。当时就是没考虑到这一点没有A掉= =
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 LL a[100010]; 5 vector<LL>v; 6 int main(){ 7 int n; 8 scanf("%d",&n); 9 for(int i=1;i<=n;++i) scanf("%lld",a+i); 10 for(int i=31;i>=0;--i){ 11 v.clear(); 12 LL ans=((1LL<<i)-1),tmp=(1LL<<i); 13 for(int i=1;i<=n;++i){ 14 if(a[i]&tmp) ans&=a[i],v.push_back(a[i]); 15 } 16 if(ans==0) break; 17 } 18 cout<<v.size()<<endl; 19 for(int i=0;i<v.size();++i){ 20 printf("%lld%c",v[i],i==v.size()-1?'\n':' '); 21 } 22 return 0; 23 }
链接:https://www.nowcoder.com/acm/contest/156/D
来源:牛客网
题目描述
托米没有完成上一个任务,准备施展黑魔法推倒 1317
而咒语的总伤害为所有 'a'... 'i' 的排列造成的伤害值之和,托米能打出多少点的伤害,是否能击败 1317 呢?
黑魔法咒语被描述为一个 长为 n 的,仅包含小写英文字母 'a'...'i' 的字符串,在托米所在的星球,魔法造成的每次有效伤害都是来自他的一个子序列,对于每一个 'a'... 'i' 的排列(共 9! 种),若作为咒语的子序列出现, 就会造成 1 的伤害
输入描述:
一行输入一个字符串 s
输出描述:
一行输出一个数,表示伤害值
备注:
|s| ≤ 3000
暴力的枚举"abcdefghi"的全排列,然后判断每一个是否可行,建立26个set保存不同字母出现的
下标,每次优先选择一个最小的且在在上一个下标之后的下标,如果不存在说明不可行。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define pii pair<int,int> 4 char s1[3010],s2[20]="abcdefghi"; 5 set<int>S[26]; 6 int main(){ 7 8 scanf("%s",s1+1); 9 int len=strlen(s1+1),i,j,ans=0; 10 if(len<9){ 11 puts("0"); 12 return 0; 13 } 14 for(i=1;i<=len;++i){ 15 S[s1[i]-'a'].insert(i); 16 } 17 do{ 18 int d=-1; 19 for(j=0;j<9;++j){ 20 if(S[s2[j]-'a'].empty())break; 21 int x=*S[s2[j]-'a'].lower_bound(d); 22 if(x<d)break; 23 else d=x; 24 } 25 if(j==9) ans++; 26 }while(next_permutation(s2,s2+9)); 27 28 printf("%d\n",ans); 29 return 0; 30 }
链接:https://www.nowcoder.com/acm/contest/156/F
来源:牛客网
题目描述
题目背景编不下去了
托米有一棵有根树 T, 树根为1,每轮他会在剩下的子树中等概率一个点 u, 砍掉 u 的子树 (包含 u),如果树上的点都被砍光了,游戏结束。
求出这个游戏进行的期望轮数,可以证明这个数一定是有理数,设他为
, 你需要告诉他一个整数 x 满足 
托米有一棵有根树 T, 树根为1,每轮他会在剩下的子树中等概率一个点 u, 砍掉 u 的子树 (包含 u),如果树上的点都被砍光了,游戏结束。
求出这个游戏进行的期望轮数,可以证明这个数一定是有理数,设他为
输入描述:
第一行输入一个数 n, 表示 T 的点数,下面 n-1 行给出了 T 的每条边
输出描述:
一行一个整数表示答案
备注:
n ≤ 105
和的期望等于期望的和,我们统计出每一个点对期望的贡献然后再求和就好了。只有删除u或u的祖先才会使得u消失,而只有删除u才会使得u做出贡献,这个概率是 1/dep[u],也就是1/u的深度,所以处理出来dep[]数组求和就好了。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 LL mod=998244353; 5 const int maxn=100010; 6 int first[maxn],tot; 7 int f[maxn]; 8 struct Edge { int v,next; }e[maxn<<1]; 9 void add(int u,int v){ 10 e[tot].v=v; 11 e[tot].next=first[u]; 12 first[u]=tot++; 13 } 14 LL gcd(LL a,LL b){ return b?gcd(b,a%b):a; } 15 LL qpow(LL a,LL b){ LL ans=1;for(;b;a=a*a%mod,b>>=1)if(b&1) ans=ans*a%mod; return ans; } 16 void dfs(int u,int fa){ 17 f[u]=1+f[fa]; 18 for(int i=first[u];~i;i=e[i].next){ 19 int v=e[i].v; 20 if(v==fa) continue; 21 dfs(v,u); 22 } 23 } 24 int main(){ 25 int n,i,u,v; 26 memset(first,-1,sizeof(first)); 27 cin>>n; 28 for(i=1;i<n;++i){ 29 scanf("%d%d",&u,&v); 30 add(u,v); 31 add(v,u); 32 } 33 dfs(1,0); 34 //for(i=1;i<=n;++i) cout<<f[i]<<endl; 35 LL x=1,y=1; 36 for(i=2;i<=n;++i){ 37 x=(x*f[i]%mod+y)%mod; 38 y=y*f[i]%mod; 39 LL g=gcd(x,y); 40 x/=g; 41 y/=g; 42 } 43 //cout<<x<<' '<<y<<endl; 44 printf("%lld\n",x*qpow(y%mod,mod-2)%mod); 45 return 0; 46 } 47 /* 48 6 49 1 2 50 1 3 51 2 6 52 3 4 53 3 5 54 */
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· 赶AI大潮:在VSCode中使用DeepSeek及近百种模型的极简方法
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
2017-07-28 字符串操作
2017-07-28 河南省多校联萌(一)