Wannafly挑战赛15

Posted 大海浩瀚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Wannafly挑战赛15相关的知识,希望对你有一定的参考价值。

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

最小化价格
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

现有n组人,m个地点,给出每组人的人数,每个地点可容纳的最大人数和选择的价格
要求一种方式,使得每组人都到一个各不相同的地点,最小化选择的价格
每个队伍的人都要在同一个地方每个地方只能有一个队伍

输入描述:

第一行n,m
第二行n个数,表示每组的人数
接下来m行,每行两个数,表示可容纳的最大人数和选择的价格

输出描述:

输出最小化选择的价格,无解输出-1
示例1

输入

3 4
2 3 4
1 2
2 3
3 4
4 5

输出

12

备注:

所有数据小于1e5
思路:优先队列+贪心;
反思:这其实是一个简单的贪心,比赛时其实已经有模糊的想法了,但是没有坚持;主要是题目理解错误导致的,仔细!!!
代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[100005];
 4 vector<int>s[100005];
 5 struct cmp{
 6     bool operator()(int a,int b){
 7         return a>b; 
 8     }
 9 };
10 priority_queue<int,vector<int>,cmp> d;
11 int cmp(int x,int y){
12     return x>y;
13 }
14 int main(){
15     int n,m;
16     scanf("%d%d",&n,&m);
17     int num;
18     for(int i=0;i<n;i++){
19         scanf("%d",&num);
20         a[num]++;
21     }
22     int x,y;
23     for(int i=0;i<m;i++){
24         scanf("%d%d",&x,&y);
25         s[x].push_back(y);
26     }
27     int cnt=0;
28     int sum=0;
29     for(int i=100000;i>=0;i--){
30         for(int j=0;j<s[i].size();j++){
31             d.push(s[i][j]);
32         }
33         while(!d.empty()&&a[i]){
34             int num=d.top();
35             d.pop();
36             sum+=num;
37             cnt++;  
38             a[i]--;
39         }
40     }
41     if(cnt>=n) printf("%d\n",sum);
42     else printf("-1\n");
43 }

 

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


车辆安排
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述

有n个队伍,每个队伍的人数小于等于5,每辆车最多坐5个人,要求一个队伍的人都在一辆车上,求最少的车数

输入描述:

第一行n
第二行n个数,表示每个队伍的人数
输出描述:

输出最少车数
示例1
输入

3
3 4 5
输出

3
备注:

n≤1e5
每个数小于等于5
思路:模拟,先求数字之和为5的,再求为4的,最后求3的;求5的时候是有顺序的,顺序找4+1,3+2,3+1+1,2+2+1,2+1+1+1,求4是同理

总结:比赛的时候没写出来,其实总体思路有了,细节没有找对,比赛的时候直接放弃了,如果继续坚持可能就过了;思维能力还是太弱了
代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a;
 4 int b[7]; 
 5 int co=0;
 6 void bas5();
 7 void bas4();
 8 void bas3();
 9 void bas2();
10 int main(){
11     int n;
12     scanf("%d",&n);
13     for(int i=0;i<n;i++){
14         scanf("%d",&a);
15         b[a]++;
16     }
17     bas5();
18     bas4();
19     bas3();
20     co+=(b[1]%5==0? (b[1]/5):(b[1]/5+1));
21     printf("%d\n",co);
22 }
23 void bas5(){
24     co+=b[5];
25     b[5]=0;
26     while(b[1]>=1&&b[4]>=1){
27         b[1]-=1;b[4]-=1;
28         co++;
29     }    
30     while(b[2]>=1&&b[3]>=1){
31         b[2]-=1;b[3]-=1;
32         co++;
33     }
34     while(b[1]>=2&&b[3]>=1){
35         b[1]-=2;b[3]-=1;
36         co++;
37     }
38     while(b[1]>=1&&b[2]>=2){
39         b[1]-=1;b[2]-=2;
40         co++;
41     }
42     while(b[1]>=3&&b[2]>=1){
43         b[1]-=3;b[2]-=1;
44         co++;
45     }
46 }
47 void bas4(){
48     co+=b[4];
49     b[4]=0;
50     while(b[1]>=1&&b[3]>=1){
51         b[1]-=1;b[3]-=1;
52         b[4]++;
53     }
54     while(b[1]>=2&&b[2]>=1){
55         b[1]-=2;b[2]-=1;
56         b[4]++;
57     }
58     while(b[2]>=2){
59         b[2]-=2;
60         b[4]++;
61     }
62     if(b[1]>=b[4]){
63         co+=b[4];
64         b[1]-=b[4];
65         b[4]=0; 
66     } 
67     else{
68         co+=b[4];
69         b[4]=0;
70         b[1]=0;
71     }
72 }
73 void bas3(){
74     co+=b[3];
75     b[3]=0;
76     while(b[1]>=1&&b[2]>=1){
77         b[1]-=1;b[2]-=1;
78         b[3]++;
79     }
80     co+=b[2];
81 } 

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

出队
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

约瑟夫问题(https://baike.baidu.com/item/约瑟夫问题),n个人,1 2报数 1出队( 就是体育课的时候1 2报数 1出队,2留下),q次询问,每次求第x个人是第几个出队的

输入描述:

第一行两个数n,q
接下来q行,每行一个数x,表示询问

输出描述:

一行输出一个询问的答案
示例1

输入

4 3
2
3
4

输出

3
2
4

说明

1 2 3 4围成一圈,第一轮:1 2报数,1出队,2留下,3出队,4留下,第二轮,2出队,4留下

备注:

q≤500000
n和x≤1e18
思路:判断第x个人之前一共报了多少次数,次数除以2加1。
代码:这是别人的代码; https://blog.csdn.net/qq_41505957/article/details/80289298
我其实还是没理解;
 1 #include<stdio.h>
 2 int main()
 3 {
 4     long long  n,x,q,sum,m;
 5     scanf("%lld%lld",&n,&q);
 6     while(q--)
 7     {
 8         scanf("%lld",&x);
 9         while(x%2==0)
10         {
11             x=n+x/2;  
12         }
13         printf("%lld\n",(x+1)/2);
14     }
15     return 0;
16 }

 

以上是关于Wannafly挑战赛15的主要内容,如果未能解决你的问题,请参考以下文章

牛客网Wannafly挑战赛15 B车辆安排(模拟)AND C 出队(规律)

Wannafly挑战赛21A

Wannafly挑战赛4. B

NowCoder Wannafly挑战赛23 体验记

Wannafly挑战赛14 F.细胞

wannafly 挑战赛10 小H和密码