码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #521 (Div. 3)

时间:2018-11-17 17:06:09      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:i++   main   ref   auto   .com   数字   --   std   二分查找   

题目链接:http://codeforces.com/contest/1077

A.Frog Jumping

解题思路:

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 LL T,a,b,k;///差值相减即可
 5 int main(){
 6     while(cin>>T){
 7         while(T--){
 8             cin>>a>>b>>k;
 9             cout<<(a-b)*(k/2)+(k%2?a:0)<<endl;
10         }
11     }
12     return 0;
13 }

B.Disturbed People

解题思路:

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 int n,cnt,a[105];///暴力即可
 5 int main(){
 6     while(cin>>n){
 7         cnt=0;
 8         for(int i=0;i<n;++i)cin>>a[i];
 9         for(int i=1;i<n-1;){
10             if(a[i-1]&&!a[i]&&a[i+1])cnt++,i+=3;
11             else i++;
12         }
13         cout<<cnt<<endl;
14     }
15     return 0;
16 }

C.Good Array

解题思路:

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const int maxn=2e5+5;
 5 int n,k,b[maxn];LL a[maxn],sum,tmp;map<LL,int> mp;
 6 int main(){
 7     while(~scanf("%d",&n)){
 8         sum=0,k=0;mp.clear();
 9         for(int i=1;i<=n;++i)scanf("%lld",&a[i]),sum+=a[i],mp[a[i]]++;///要用map记录每个数字出现的次数,不能用set容器
10         for(int i=1;i<=n;++i){
11             if((sum-a[i])&1LL)continue;
12             tmp=(sum-a[i])>>1;
13             mp[a[i]]--;
14             if(mp[tmp])b[k++]=i;
15             mp[a[i]]++;
16         }
17         printf("%d\n",k);
18         if(!k)puts("");
19         for(int i=0;i<k;++i)printf("%d%c",b[i],(i==k-1)?\n: );
20     }
21     return 0;
22 }

D.Cutting Out

解题思路:

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include <map>
 4 #include <vector>
 5 using namespace std;
 6 typedef long long LL;
 7 int n, k, x, l, r, mid, t;
 8 map<int, int> mp;
 9 vector<int> ans, cnt;
10 bool check(int z){
11     int sum = 0;
12     for (auto num : cnt)sum += num / z;
13     return sum >= k;
14 }
15 int main(){
16     while (~scanf("%d%d", &n, &k)){
17         mp.clear(), ans.clear(), cnt.clear(); l = 1, r = n;
18         for (int i = 0; i < n; ++i)scanf("%d", &x), mp[x]++;
19         for (auto y : mp)cnt.push_back(y.second);///保存对应数字出现的次数
20         while (l <= r){///二分查找要切的最大次数
21             mid = (l + r) >> 1;
22             if (check(mid))l = mid + 1;///最大化往右边找
23             else r = mid - 1;
24         }
25         for (auto u : mp){
26             t = u.second / r;
27             while (t--)ans.push_back(u.first);///第i个元素一次需要取t个
28         }
29         for (int i = 0; i < k; ++i)printf("%d%c", ans[i], i == k - 1 ? \n :  );
30     }
31     return 0;
32 }

 

Codeforces Round #521 (Div. 3)

标签:i++   main   ref   auto   .com   数字   --   std   二分查找   

原文地址:https://www.cnblogs.com/acgoto/p/9974594.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!