Codeforces Round #451 (Div. 2)A,B,C,D,EC题:模拟 D题:尺取+贪心 E题:思维+优先队列维护最值

Posted pengge666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #451 (Div. 2)A,B,C,D,EC题:模拟 D题:尺取+贪心 E题:思维+优先队列维护最值相关的知识,希望对你有一定的参考价值。

技术图片

 

 特判最后一位即可

 1 #include<bits/stdc++.h>
 2  
 3 using namespace std;
 4 #define int long long
 5  
 6 signed main(){
 7     int n;cin>>n;int t=n%10;
 8     if(t==0) cout<<n;
 9     else if(t>5) {
10         cout<<(n+10-t);
11     }
12     else {
13         cout<<(n-t);
14     }
15     return 0;
16 }

技术图片

 

 暴力就OK了

 1 #include<bits/stdc++.h>
 2  
 3 using namespace std;
 4 #define int long long
 5  
 6 signed main(){
 7     int n,a,b;
 8     cin>>n>>a>>b;
 9     for(int i=0;;i++){
10         if((n-i*a)%b==0&&(n-i*a)>=0){
11             cout<<"YES"<<
;
12             cout<<i<<" "<<(n-i*a)/b;
13             return 0;
14         }
15         if(a*i>n){
16             break;
17         }
18     }
19     cout<<"NO";
20     return 0;
21 }

技术图片

 

 一道模拟题。

 1 #include<bits/stdc++.h>
 2  
 3 using namespace std;
 4 #define int long long
 5 vector<string> v[66666];
 6 vector<string> ans[66666];
 7 map<string,int> vis;
 8 string st[66666];
 9 signed main(){
10     int n;
11     cin>>n;
12     int cnt=1;
13     for(int i=1;i<=n;i++){
14         string str;
15         cin>>str;
16         if(!vis[str]){
17             vis[str]=cnt;
18             st[cnt]=str;
19             cnt++;
20         }
21         int m;
22         cin>>m;
23         for(int j=0;j<m;j++){
24              string tle;
25              cin>>tle;
26              v[vis[str]].push_back(tle);
27         }
28     }
29     for(int i=1;i<cnt;i++){ // vector实现去重 
30         sort(v[i].begin(), v[i].end());
31         v[i].erase(unique(v[i].begin(), v[i].end()), v[i].end());
32     }
33     
34     //cout<<‘
‘;
35     for(int i=1;i<cnt;i++){
36         map<string,int> mp;
37         for(int j=0;j<v[i].size();j++){
38             int f=0; 
39             string temp=v[i][j];
40             int len=temp.size();
41             for(int k=0;k<v[i].size();k++){
42                 if(temp==v[i][k]) continue;
43                 if(v[i][k].size()>temp.size()){ //后缀 
44                      if(temp==v[i][k].substr(v[i][k].size()-len,len)){
45                          f=1;
46                          break;
47                      }
48                 }
49             }
50             if(f){
51                 mp[temp]=1;
52             }
53         }
54         for(int j=0;j<v[i].size();j++){
55             if(!mp[v[i][j]])
56             ans[i].push_back(v[i][j]);
57         }        
58     }
59     cout<<cnt-1<<
;
60     for(int i=cnt-1;i>=1;i--){
61         cout<<st[i]<<" "<<ans[i].size()<<" ";
62         for(int j=0;j<ans[i].size();j++){
63             if(!j) cout<<ans[i][j];
64             else cout<<" "<<ans[i][j];
65         } 
66         cout<<
;
67     }
68     return 0;
69 }

技术图片

 

 尺取+贪心

题意 : 给你n个闹钟,分别在aiai分钟响。要求在任意m分钟内,不能多余k个闹钟响,否则就会醒来,求关闭的最少的闹钟数

 1 #include<bits/stdc++.h>
 2  
 3 using namespace std;
 4 #define maxn 666666
 5 #define int long long
 6 int arr[maxn];
 7 signed main(){
 8     int n,m,k;
 9     cin>>n>>m>>k;
10     for(int i=1;i<=n;i++) cin>>arr[i];
11     sort(arr+1,arr+1+n);
12     int ans=0;
13     deque<int> q;
14     for(int i=1;i<=n;i++){
15         while(!q.empty()&&arr[i]-q.front()>=m) q.pop_front();
16         if(q.size()>=k-1){
17             ans++;
18         }else{
19             q.push_back(arr[i]);
20         }
21  
22     }
23     cout<<ans;
24     return 0;
25 }

技术图片

 

 题意:给你n个数,现在你可以进行一系列操作,每次操作可以对任意一个数加一或者减一,使得进行操作后n个数中恰好有一半是平方数还有一半是非平方数。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define int long long
 4 priority_queue<int,vector<int>, greater<int> > q1;//平方数 
 5 priority_queue<int,vector<int>, greater<int> > q2;//非平方数 
 6 signed main(){
 7     int n;
 8     cin>>n;
 9     int sum1=0;//平方数
10     int sum2=0;//非平方数 
11     for(int i=1;i<=n;i++){
12         int t;cin>>t;
13         int cnt=(int)sqrt(t*1.0);
14         if(cnt*cnt==t){
15             sum1++;
16             if(t) q1.push(1);
17             else q1.push(2);
18         }else{
19             sum2++;
20             int temp=min((cnt+1)*(cnt+1)-t,t-cnt*cnt);
21             q2.push(temp);
22         }
23     }
24     if(sum1==sum2&&sum1==n/2){
25         cout<<"0";
26         return 0;
27     }
28     if(sum1>n/2){
29         int sum=0;
30         int _=abs(sum1-n/2);
31         while(_--){
32             sum+=q1.top();
33             q2.pop();
34         }    
35         cout<<sum;
36         return 0;
37     }
38     int add=0;
39         int _=abs(sum2-n/2);
40         while(_--){
41             add+=q2.top();
42             q2.pop();
43         }    
44         cout<<add;
45     return 0;
46 }

以上是关于Codeforces Round #451 (Div. 2)A,B,C,D,EC题:模拟 D题:尺取+贪心 E题:思维+优先队列维护最值的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #451 (Div. 2) ABC

Codeforces Round #451 (Div. 2) D. Alarm Clock

Codeforces Round #451 (Div. 2) DAlarm Clock

Codeforces Round #451 Div. 2 C D E

Codeforces Round #451 (Div. 2) F Restoring the Expression

Codeforces Round #451 (Div. 2)F. Restoring the Expression 字符串hash