牛客练习赛23-A/B/C/D

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 分

输入描述:

第一行输入一个正整数 T下面 T 行每行两个整数 a,b

输出描述:

每行输出 13 个正整数 n
1
 ...n
13
, 对应题面顺序给出最小化支出纸票数量和硬币数量之和的情况下,每种货币的使用次数,如果有多种方案,输出字典序最大的一种,注意这里字典序是依次比较n1到n13,而不是简单的把 13 个正整数拼接在一起
示例1

输入

复制
2
1 5
2 4

输出

复制
0 0 0 0 0 0 1 0 0 0 1 0 0
0 0 0 0 0 1 0 0 0 0 0 2 0

备注:

T=100,0≤ a≤ 10
9
, 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 的分数,托米希望你能帮他最大化他的得分。

输入描述:

第一行一个正整数 T下面 T 行每行一个正整数 n

输出描述:

对于每组数据,输出托米的最大得分
示例1

输入

复制
1 5

输出

复制
10

备注:

T≤ 10
4
, n≤ 10
9
 
   观察后发现答案就是前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 个自然数 a 1... a n, 托米可以选出一些带回家,但是他选出的数需要满足一些条件
设托米选出来了k 个数 b 1,b 2... b k, 设这个数列 b 的给值为 b 中所有数按位与的结果,如果你能找到一个整除 b 的最大的 2 v,(v≥ 0), 则设定 v 为这个数列的给价,如果不存在这样的 v,则给价值为 -1, 1317 希望托米在最大化给价的情况下,最大化 k

输入描述:

第一行输入一个整数 n, 第二行输入 a
1
...a
n

输出描述:

第一行输出最大的整数 k, 第二行输出 k 个整数 b
1
... b
k
, 按原数列的相对顺序输出 (如果行末有额外空格可能会格式错误)
示例1

输入

复制
5
1 2 3 4 5

输出

复制
2
4 5

备注:

n≤ 10
5
, a
1
... a
n < 2 31

  从大到小来枚举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

黑魔法咒语被描述为一个 长为 n 的,仅包含小写英文字母 'a'...'i' 的字符串,在托米所在的星球,魔法造成的每次有效伤害都是来自他的一个子序列,对于每一个 'a'... 'i' 的排列(共 9! 种),若作为咒语的子序列出现, 就会造成 1 的伤害

而咒语的总伤害为所有 'a'... 'i' 的排列造成的伤害值之和,托米能打出多少点的伤害,是否能击败 1317 呢?

输入描述:

一行输入一个字符串 s

输出描述:

一行输出一个数,表示伤害值
示例1

输入

复制
aabcdefghi

输出

复制
1

备注:

|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 }
 
  
 

猜你喜欢

转载自www.cnblogs.com/zzqc/p/9381077.html