牛客网国庆集训派对Day3题目 2018年

链接:https://www.nowcoder.com/acm/contest/203/D
来源:牛客网

Shopping
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld

题目描述

你要买n件物品,其中有一些是凳子。
商场正在举行促销活动,如果购物车中有至少一个凳子,那么你可以半价购买这个购物车中最贵的一个物品。
你有m辆购物车,请最小化你的花费。

输入描述:

第一行一个整数t表示数据组数 (1 ≤ t ≤ 100)。
每组数据第一行两个整数n,m (1 ≤ n,m ≤ 1000),接下来n行每行两个整数a
i
,b
i
,分别表示第i件物品的价格以及它是否是凳子 (1 ≤ a
i
 ≤ 10
5
, 0 ≤ b
i
 ≤ 1)。

输出描述:

每组数据输出一行一个实数表示最小花费,保留一位小数。
示例1

输入

复制
2
5 1
1 0
2 1
3 1
4 0
5 0
5 10
1 0
2 1
3 1
4 0
5 0

输出

复制
12.5
10.5
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 double a[1100],b[1100];
 4 int main()
 5 {
 6     int t;
 7     scanf("%d",&t);
 8     while(t--)
 9     {
10         int n,m;
11         scanf("%d%d",&n,&m);
12         for(int i=0;i<n;i++)
13         {
14             scanf("%lf%lf",&a[i],&b[i]);
15         }
16         sort(a,a+n);
17         int sum=0;
18         for(int i=0;i<n;i++)
19         {
20             if(b[i]==1)
21             {
22                 sum++;
23             }
24         }
25         if(sum<=m)
26         {
27             for(int i=n-1;i>=n-sum;i--)
28             {
29                 a[i]/=2;
30             }
31         }
32         else
33         {
34             for(int i=n-1;i>=n-m;i--)
35             {
36                 a[i]/=2;
37             }
38         }
39         double ans=0;
40          for(int i=0;i<n;i++)
41          {
42             // cout<<a[i]<<" ";
43              ans+=a[i];
44          }
45          printf("%.1f\n",ans);
46     }
47     return 0;
48 }

 

链接:https://www.nowcoder.com/acm/contest/203/H
来源:牛客网

Travel
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld

题目描述

魔方国有n座城市,编号为。城市之间通过n-1条无向道路连接,形成一个树形结构。
澜澜打算在魔方国进行m次旅游,每次游览至少一座城市。为了方便,每次旅游游览的城市必须是连通的。此外,澜澜希望游览所有城市恰好一次。
澜澜想知道有多少种旅游方案满足条件,两个方案不同当且仅当存在某一次旅游游览了不同的城市。
澜澜不会数数,所以只好让你来帮他数方案。

输入描述:

第一行一个整数t表示数据组数 (1 ≤ t ≤ 100)。
每组数据第一行两个整数n,m
,接下来n-1行每行两个整数a
i
,b
i
表示一条道路 (1≤ a
i
,b
i
≤ n)。

输出描述:

每组数据输出一行一个整数表示方案数对10
9
+7取模的结果。
示例1

输入

复制
2
3 1
1 2
1 3
3 2
1 2
1 3

输出

复制
1
4
思路:组合数C(n-1,m-1)*m!

代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn = 1 << 20;
 5 const int mod = 1000000007;
 6 int t, n, m, ta, tb;
 7 ll c[maxn];
 8 ll qq(ll a, ll b, ll c)
 9 {
10     ll ans = 1;
11     a = a % c;
12     while (b>0)
13     {
14         if (b % 2 == 1)
15             ans = (ans * a) % c;
16         b = b / 2;
17         a = (a * a) % c;
18     }
19     return ans;
20 }
21 
22 ll C(ll n, ll m)
23 {
24     return c[n] * qq(c[m] * c[n - m] % mod, mod - 2, mod) % mod;
25 }
26 int main(void)
27 {
28     scanf("%d", &t);
29      c[1] = 1;
30     for (int i = 2; i <= maxn; i++)
31     {
32         c[i] = c[i - 1] * i%mod;
33     }
34     while (t--)
35     {
36         scanf("%d%d", &n, &m);
37         for (int i = 0; i < n - 1; i++)
38             scanf("%d%d",&ta,&tb);
39         if (m == 1)
40         {
41             printf("1\n");
42             continue;
43         }
44         ll ans = C(n - 1, m - 1);
45         ans = (ans*c[m]) % mod;
46         cout << ans << endl;
47     }
48     return 0;
49 }

 



posted @ 2018-10-03 15:56  白雪儿  Views(447)  Comments(3)    收藏  举报