A. Holidays
题意:一个星球 五天工作,两天休息。给你一个1e6的数字n,问你最少和最多休息几天。
思路:我居然写成模拟题QAQ。
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 //#define int long long 5 6 signed main(){ 7 int n; 8 cin>>n; 9 if(n%7==0){ 10 int x=n/7;x*=2; 11 cout<<x<<" "<<x; 12 return 0; 13 } 14 int ans1=0; 15 int ans2=0; 16 int i=1; 17 int temp=n; 18 while(1){ 19 if(temp<=0) 20 break; 21 if(i%2) 22 temp-=5; 23 else{ 24 ans1+=min(temp,2);temp-=min(temp,2); 25 } 26 i++; 27 if(temp<=0) 28 break; 29 } 30 i=1; 31 temp=n; 32 while(1){ 33 if(temp<=0) 34 break; 35 if(i%2==0) 36 temp-=5; 37 else 38 ans2+=min(temp,2),temp-=min(temp,2); 39 i++; 40 if(temp<=0) 41 break; 42 } 43 cout<<ans1<<" "<<ans2; 44 return 0; 45 } 46 /* 47 6 48 1 2 49 7 50 2 2 51 8 52 2 3 53 9 54 2 4 55 56 */
B. Game of Robots
题意:第一个机器人报自己的编号;第二个报前一个机器人和自己的编号;第三个机器人报前两个机器人和自己的编号。以此类推。
每个机器人一个编号。问k个报什么。
思路:简化M的值。
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include<bits/stdc++.h> 5 using namespace std; 6 #define int unsigned long long 7 #define N 1500050 8 int arr[N]; 9 10 signed main(){ 11 int n,m; 12 cin>>n>>m; 13 14 for(int i=1;i<=n;i++){ 15 cin>>arr[i]; 16 17 if(m<=i){ 18 continue; 19 }else{ 20 m-=i; 21 } 22 } 23 cout<<arr[m]; 24 return 0; 25 }
C. Cinema
题意:有n个人,每个人只会一种语言(不同编号表不同语言)。
现在有m部电影,每部电影的声音是a[i],字幕是b[i]。(a[i]输入完输入b[i])
如果听得懂声音,他会非常满意,如果字幕他能看懂的话他会比较满意,否则它很不满意。
现在问看哪部电影会使得n个人满意最高(如果两部电影使n个人非常满意的人数相同时,选比较满意的最多的)。
思路:看了一些大佬的博客,都是用离散化。可是菜菜的我不会离散化QAQ。结果用个哈希MAP。居然水过。unordered_map<int,int> mp是个好东西。。。。。。。。。。。
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define int long long 5 struct str{ 6 int x,y,id; 7 }st[300900]; 8 unordered_map<int,int> mp; 9 bool cmp(str a,str b){ 10 if(mp[a.x]!=mp[b.x]){ 11 return mp[a.x]>mp[b.x]; 12 }else{ 13 return mp[a.y]>mp[b.y]; 14 } 15 } 16 signed main(){ 17 int n; 18 cin>>n; 19 for(int i=1;i<=n;i++){ 20 int temp; 21 scanf("%lld",&temp); 22 mp[temp]++; 23 } 24 int m; 25 cin>>m; 26 for(int i=1;i<=m;i++){ 27 scanf("%lld",&st[i].x); 28 st[i].id=i; 29 } 30 for(int i=1;i<=m;i++){ 31 scanf("%lld",&st[i].y); 32 } 33 sort(st+1,st+1+m,cmp); 34 cout<<st[1].id; 35 return 0; 36 }
D1. Magic Powder
题意:做一个蛋糕需要n个原材料,现有k个魔法材料,魔法材料可以替代成任何材料,现在告诉你蛋糕每个材料需要多少,以及你现在有多少个,问你最多能够做出多少个蛋糕来。
思路:看了一下数据范围,然后开始暴力。
AC代码:
1 /* 2 3 10 926 4 5 6 8 1 2 5 1 8 4 4 5 351 739 998 725 953 970 906 691 707 1000 6 */ 7 #include<bits/stdc++.h> 8 9 using namespace std; 10 #define int long long 11 map<int,int> mp; 12 int arr[2500]; 13 signed main(){ 14 int n,m; 15 cin>>n>>m; 16 int temp; 17 for(int i=1;i<=n;i++){ 18 scanf("%lld",&temp); 19 mp[i]=temp; 20 } 21 for(int i=1;i<=n;i++){ 22 scanf("%lld",&arr[i]); 23 } 24 int ans=0; 25 while(1){ 26 int flag=1; 27 for(int i=1;i<=n;i++){ 28 if(arr[i]>=mp[i]){ 29 arr[i]-=mp[i]; 30 }else{ 31 int x=mp[i]-arr[i]; 32 if(x<=m){ 33 m-=x; 34 arr[i]+=x; 35 arr[i]-=mp[i]; 36 }else{ 37 flag=0; 38 break; 39 } 40 } 41 } 42 if(flag){ 43 ans++; 44 }else{ 45 break; 46 } 47 } 48 cout<<ans; 49 50 return 0; 51 }
D2. Magic Powder
二分做法。感觉以前做过类似的题目。
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 #define N 190000 5 #define int unsigned long long 6 int n,k; 7 int arr[N]; 8 int vis[N]; 9 signed main(){ 10 scanf("%lld%lld",&n,&k); 11 for(int i=1;i<=n;i++) 12 { 13 int temp; 14 scanf("%lld",&temp); 15 vis[i]=temp; 16 } 17 for(int i=1;i<=n;i++) 18 { 19 scanf("%lld",&arr[i]); 20 } 21 int l=0; 22 int r=9000000000; 23 while(l<=r){ 24 int mid=(l+r)/2; 25 int sum=0; 26 for(int i=1;i<=n;i++){ 27 if(arr[i]<vis[i]*mid){ 28 sum+=vis[i]*mid-arr[i]; 29 } 30 if(sum>k){ 31 break; 32 } 33 } 34 if(sum==k){ 35 cout<<mid; 36 return 0; 37 }else if(sum<k){ 38 l=mid+1; 39 }else{ 40 r=mid-1; 41 } 42 } 43 cout<<l-1; 44 return 0; 45 }