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 }
02-12 22:36