Educational Codeforces Round 108 (Rated for Div. 2) ABCD题解


A - Red and Blue Beans

题目链接
题意:给你一袋有 n n n个红豆一袋 m m m个蓝豆问你能不能分为好几袋 a b s ( n − m ) < = k abs(n-m)<=k abs(nm)<=k

所以就是判断最大程度分能不能达到 < = k <=k <=k

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1000005;
 ll t, r, b, d, q, n, m;
int main(){
        cin>>t;
        while(t--) {
            cin>>r>>b>>d;
            q=0;
            if(d==0) {
                if(r!=b) q=1;
            }else {
                n=max(r, b);
                m=min(r, b);
                if(n%m==0) n/=m;//比赛写成了(n+1)/m应该是(n+m-1)/m向上取整突然不会整了
                else n=n/m+1;
                if(n-1>d)q=1;
            }
            if(q) cout<<"NO"<<endl;
            else cout<<"YES"<<endl;
        }
    return 0;
}

B - The Cake Is a Lie

题目链接
题意:向下走消耗 y y y能量,向右走消耗 x x x能量

多画几张图就能知道答案是 n ∗ m − 1 n*m-1 nm1
或者验证发现怎么走消耗都是一样的 所以答案就是 n + n ∗ ( m − 1 ) − 1 n+n*(m-1)-1 n+n(m1)1;

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1000005;
 ll t, r, a, b, d, q, n, m, k, ans;
int main(){
        cin>>t;
        while(t--) {
            cin>>m>>n>>k;
            if(k==n*m-1) cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
    return 0;
}

C - Berland Regional

题目链接
题意:给你一堆学校和各个学校的各个成员的编程能力,然后各个学校要把他们的成员分成有 k k k个人的组,输出所有学校能这样分的组的能力总和

直接就暴力 反正当时很怕会WA 其实看着 n 2 n2 n2其实就是 n l o g n nlogn nlogn。。。
想很久就是不写

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 200005;
 ll t, a[N], b[N], sum[N], n, m, k, ans[N], x;
 vector<ll> v[N];
 set<ll> se;
int main(){
        cin>>t;
        while(t--) {
            cin>>n;
            memset(sum,0,sizeof(sum));
            memset(ans,0,sizeof(ans));
            se.clear();
            for(int i=1; i<=n; i++){
                v[i].clear();
            }
            for(int i=1; i<=n; i++) {
                cin>>a[i];
                se.insert(a[i]);//存队伍
            }
            for(int i=1; i<=n; i++) {
                cin>>x;
                v[a[i]].push_back(x);//存成员
            }
            for(auto x:se){
                sort(v[i].begin(), v[i].end(), greater<ll>());
                m=v[i].size();
                for(int j=1; j<=m; j++){
                    sum[j]=v[x][j-1]+sum[j-1];//前缀和这里想不到
                }
                for(int j=1; j<=m; j++){
                    ans[j]+=sum[m/j*j];
                }
            }
            for(int i=1;i<=n;i++){
               cout<<ans[i]<<" \n"[i==n];
              }
        }
    return 0;
}

D - Maximum Sum of Products

题目链接
题意:给你 n n n a a a数组和 b b b数组,你要翻转子序列使 a i ∗ b i a{i}*bi aibi的总和最大

可以dp也可以模拟+前缀和
最后了题目都看错了以为是交换两个。。。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 5005;
 ll t, r, n, m, a[N], b[N], dp[N][N], sum, ans;
int main(){
        cin>>n;
        for(int i=1; i<=n; i++) {
            cin>>a[i];
        }
        for(int i=1; i<=n; i++) {
            cin>>b[i];
            sum+=a[i]*b[i];
        }
        for(int k=2; k<=n; k++) {
            for(int i=1; i<=n-k+1; i++) {
                int j=i+k-1;
                dp[i][j]=dp[i+1][j-1]+(a[i]-a[j])*(b[j]-b[i]);
                ans=max(ans, dp[i][j]);
            }
        }
        //cout<<sum<<endl;
        cout<<ans+sum<<endl;
    return 0;
}


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值