Codeforces Round #544 (Div. 3)

A. Middle of the Contest

思路:签到题,不多说。

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(false)
#define DEBUG cout<<endl<<"DEBUG"<<endl;
#define mod 998244353
using namespace std;

int main() {
    int a,b,c,d;
    scanf("%d:%d ",&a,&b);
    scanf("%d:%d",&c,&d);
    int h=c-a;
    int m=d-b;
    if(h%2!=0){
        m+=60;
    }
    m/=2;
    if(b+m>=60){
        m-=60;
        h++;
    }
    h/=2;
    printf("%02d:%02d",a+h,b+m);
    return 0;
}

B. Preparation for International Women's Day

思路:统计余数。余数相加等于k或者余数是0的符合条件。

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(false)
#define DEBUG cout<<endl<<"DEBUG"<<endl;
#define mod 998244353
using namespace std;
ll n, k, a[120], ans;
int main() {
    cin >> n >> k;
    for(ll i = 0, s; i < n; i++) {
        cin >> s;
        a[s % k]++;
    }
    ans += (a[0] / 2);
    if(k % 2 == 1)
        for(ll i = 1; i <= k / 2; i++) {
            ll minn = INF;
            minn = min(minn, a[i]);
            minn = min(minn, a[k - i]);
            ans += minn;
        } else {
        for(ll i = 1; i < k / 2; i++) {
            ll minn = INF;
            minn = min(minn, a[i]);
            minn = min(minn, a[k - i]);
            ans += minn;
        }
        ans += a[k / 2] / 2;
    }
    cout << ans * 2;
    return 0;
}

C. Balanced Team

思路:简单题,记得优化。

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(false)
#define DEBUG cout<<endl<<"DEBUG"<<endl;
#define mod 998244353
using namespace std;
ll n, k, a[200100], ans;
int main() {
    cin >> n;
    for(ll i = 1; i <= n; i++)
        cin >> a[i];
    sort(a + 1, a + n + 1);
    for(ll zuo = 1; zuo < n; zuo++) {
        for(ll you = zuo + ans; you <= n; you++) {
            if(a[you] - a[zuo] <= 5) {
                ans = max(ans, you - zuo);
            } else
                break;
        }
    }
    cout << ans + 1;
    return 0;
}

D Zero Quantity Maximization

思路:map来统计个数,a和b相除一样的说明是可以用一个d来除,记得用long double。

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(false)
#define DEBUG cout<<endl<<"DEBUG"<<endl;
using namespace std;
const int MAX = 2e5 + 10;
int n, ans;
long double a[MAX], b[MAX], s;
map<long double, int>mp;
int main() {IOS;
    cin >> n;
    for(int i = 0; i < n; i++)
        cin >> a[i];
    for(int i = 0; i < n; i++) {
        cin >> s;
        if(a[i] != 0 && s != 0)
            mp[a[i] / s]++;
        if(s == 0 && a[i] != 0)
            mp[0]++;
        if(s == 0 && a[i] == 0)
            ans++;
    }
    int maxx = 0;
    for(auto &s : mp) {
        maxx = max(maxx, s.second);
    }
    cout << maxx + ans;
    return 0;
}

E:K Balanced Teams

思路:动态规划,f[i][j]表示前i个人分为j组共可以选多少人最多。

对于f[i][j]必须继承上一次的最大人数。

然后用尺取法选择当前区段小于5的个数。

f[i][k]=max(f[i][k],f[j-1][k-1]+i-j+1)转移方程,i是第i个人的位置,k是第k组,j是区间扩展的最左位置。

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(false)
#define DEBUG cout<<endl<<"DEBUG"<<endl;
#define maxn 100001
using namespace std;
int n, m, arr[maxn], f[5050][5050];
int main() {
    cin >> n >> m;
    for(int i = 1; i <= n; i++) {
        cin >> arr[i];
    }
    sort(arr + 1, arr + n + 1);
    for(int i = 1, j = 1; i <= n; i++) {
        for(int k = 1; k <= m; k++)//先设不选第i个,继承上一次的
            f[i][k] = f[i - 1][k];
        while(arr[j] + 5 < arr[i])//选择区间
            j++;
        for(int k = 1; k <= m; k++)//比较选j-1到i的区间的人多还是不选人多。
            f[i][k] = max(f[i][k], f[j - 1][k - 1] + i - j + 1);
    }
    cout << f[n][m];
    return 0;
}

F1 - Spanning Tree with Maximum Degree

思路:最大度数最大,那用vector存边,找有最大度数的。

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(false)
#define DEBUG cout<<endl<<"DEBUG"<<endl;
using namespace std;
int n, m, i, x, y, v, d, mv, c[222000];
vector<int> g[222000];
queue<int> q;
int main() {
    for(cin >> n >> m; i < m; i++)
        cin >> x >> y, g[x].push_back(y), g[y].push_back(x);
    for(i = 1; i <= n; i++)
        d < g[i].size() ? d = g[i].size(), mv = i : 0;
    q.push(mv), c[mv] = 1;
    while(!q.empty()) {
        v = q.front();
        q.pop();
        for(auto e : g[v]) {
            if(!c[e]) {
                cout << v << " " << e << "\n";
                q.push(e), c[e] = 1;
            }
        }
    }
}

F2 - Spanning Tree with One Fixed Degree

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值