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
空间限制: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
空间限制: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的主要内容,如果未能解决你的问题,请参考以下文章