NowCoder牛客练习赛7-A.骰子的游戏 B.购物-优先队列
Posted Persistent.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NowCoder牛客练习赛7-A.骰子的游戏 B.购物-优先队列相关的知识,希望对你有一定的参考价值。
A.骰?的游戏
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
在Alice和Bob面前的是两个骰子,上面分别写了六个数字。
Alice和Bob轮流丢掷骰子,Alice选择第一个骰子,而Bob选择第二个,如果谁投掷出的数更大,谁就可以获胜。
现在给定这两个骰子上的6个数字,你需要回答是Alice获胜几率更大,还是Bob获胜几率更大。(请注意获胜几率相同的情况)
输入描述:
第一行一个数T,表示数据个数。
接下来的每一组数据一共有2行,每一行有6个正整数,第一行是第一个骰子上的6个数,第二行是第二个骰子上的6个数。
输出描述:
如果Alice获胜几率更大,你需要输出Alice;
如果Bob获胜几率更大,你需要输出Bob;
如果获胜几率一样大,你需要输出Tie。
输入
2 3 3 3 3 3 3 1 1 4 4 4 4 1 2 3 4 5 6 6 5 4 3 2 1
输出
Bob Tie
说明
第一个数据中,Alice有三分之一几率获胜,Bob有三分之二几率获胜;
第二个数据中,Alice和Bob的骰子完全一致,所以获胜几率一样大。
备注:
对于30%的数据,1 ≤ T ≤ 10。
对于60%的数据,1 ≤ T ≤ 1000。
对于100%的数据,1 ≤ T ≤ 105,所有输入的数均 ≤ 107。
代码:
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 typedef long long ll; 8 int a[10],b[10]; 9 int main(){ 10 int t; 11 scanf("%d",&t); 12 while(t--){ 13 for(int i=0;i<6;i++) 14 scanf("%d",&a[i]); 15 for(int i=0;i<6;i++) 16 scanf("%d",&b[i]); 17 int num=0,cnt=0; 18 for(int i=0;i<6;i++){ 19 for(int j=0;j<6;j++){ 20 if(a[i]>b[j])num++; 21 if(a[i]<b[j])cnt++; 22 } 23 } 24 if(num>cnt)printf("Alice\n"); 25 else if(num<cnt)printf("Bob\n"); 26 else printf("Tie\n"); 27 } 28 return 0; 29 }
B.购物
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
那么问题来了,你最少需要多少钱才能达成自己的目的呢?
输入描述:
第一行两个正整数n和m,分别表示天数以及糖果店每天生产的糖果数量。
接下来n行(第2行到第n+1行),每行m个正整数,第x+1行的第y个正整数表示第x天的第y个糖果的费用。
输出描述:
输出只有一个正整数,表示你需要支付的最小费用。
输入
3 2 1 1 100 100 10000 10000
输出
107
输入
5 5 1 2 3 4 5 2 3 4 5 1 3 4 5 1 2 4 5 1 2 3 5 1 2 3 4
输出
10
备注:
对于100%的数据,1 ≤ n, m ≤ 300 , 所有输入的数均 ≤ 10^6。
1 #include<cstring> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<iostream> 6 #include<queue> 7 using namespace std; 8 typedef long long ll; 9 const int N=1e4+10; 10 int a[N][N]; 11 priority_queue<int,vector<int>,greater<int> >gg; 12 int main(){ 13 int n,m; 14 ll ans; 15 while(cin>>n>>m){ 16 for(int i=1;i<=n;i++) 17 for(int j=1;j<=m;j++) 18 cin>>a[i][j]; 19 for(int i=1;i<=n;i++) 20 sort(a[i]+1,a[i]+1+m); 21 for(int i=1;i<=n;i++){ 22 int cnt=1; 23 for(int j=1;j<=m;j++){ 24 a[i][j]+=cnt; 25 cnt+=2; 26 } 27 } 28 ans=0; 29 for(int j=1;j<=m;j++) 30 gg.push(a[1][j]); 31 ans+=gg.top(); 32 gg.pop(); 33 for(int i=2;i<=n;i++){ 34 for(int j=1;j<=m;j++) 35 gg.push(a[i][j]); 36 ans+=gg.top(); 37 gg.pop(); 38 } 39 cout<<ans; 40 } 41 return 0; 42 }
一开始二维数组排序的通过了90%的数据,应该是卡在一组很大的数上了。
贴一下差点通过的代码。。。
1 wa90%d的数据,应该是卡在一组很大的数上了。
2 #include<iostream>
3 #include<cstring>
4 #include<cstdio>
5 #include<algorithm>
6 #include<cmath>
7 using namespace std;
8 typedef long long ll;
9 const int N=2e4+1000;
10 const int maxn=1e7+10;
11 const int INF=0x3f3f3f3f;
12 int a[N][N],b[maxn];
13 int main(){
14 int n,m;
15 ll ans;
16 while(~scanf("%d%d",&n,&m)){
17 for(int i=1;i<=n;i++)
18 for(int j=1;j<=m;j++)
19 scanf("%d",&a[i][j]);
20 for(int i=1;i<=n;i++)
21 sort(a[i]+1,a[i]+1+m);
22 for(int i=1;i<=n;i++){
23 int cnt=1;
24 for(int j=1;j<=m;j++){
25 a[i][j]+=cnt;
26 cnt+=2;
27 }
28 }
29 ans=0;
30 sort(a[1]+1,a[1]+m);
31 ans+=a[1][1];
32 a[1][1]=INF;
33 int h=0;
34 for(int i=1;i<=n;i++)
35 for(int j=1;j<=m;j++)
36 b[h++]=a[i][j];
37 sort(b,b+h);
38 //for(int i=0;i<h;i++)
39 //printf("%d ",b[i]);
40 for(int i=0;i<n-1;i++)
41 ans+=b[i];
42 printf("%lld\n",ans);
43 }
44 return 0;
45 }
溜啦溜啦,还有一道珂朵莉的数列的树状数组+大数(高精度)没写出来,补题补题。
以上是关于NowCoder牛客练习赛7-A.骰子的游戏 B.购物-优先队列的主要内容,如果未能解决你的问题,请参考以下文章
牛客网NowCoder 2018年全国多校算法寒假训练营练习比赛(第四场)A.石油采集(dfs) B.道路建设(最小生成树prim) C.求交集(暴力) F.Call to your teacher
nowcoder 1.20牛客练习赛95 ADuplicate Strings
nowcoder 1.20牛客练习赛95 ADuplicate Strings
牛客网NowCoder 2018年全国多校算法寒假训练营练习比赛(第三场)A.不凡的夫夫(斯特林公式) D.小牛vs小客 E.进击吧!阶乘(大数Java) G.大水题(数学)