Codeforces Round 889 (Div. 2)题解

这里总结一下codeforces的题目类型:

题目做法练法
A 简单思维考察见多识广和反应的能力 几乎读题出答案
B 规律推导不仅仅需要多观察上几个样例 必须自己从小到大一下 规律一般很明显
C 巧妙模拟条件较多的模拟,分类不恰当容易写不出来,有窍门
D 简单dp动态规划的简单题目 多练很简单 因为规定了算法 甚至要比1 2题目简单

C
easy:让一个数字尽可能地大,然后让他来改变全局的递增递减性质
(这个考场上完全想到了,但是没有写出来,实在是可惜可惜) 但是对于c题做了不少了,可以发现基本上来说就是一点思维稍微高点的题目,或者说情况多一点的模拟题目 d题一般是dp这样的题目,都不算很复杂,关键就是见得多了就好了:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<set>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
using namespace std;

typedef pair<int,int> PII;
const int N=25;
const int inf=0x3f3f3f3f;
int a[N];

signed main(){
    IOS;
    int T;  cin>>T;
    while(T--){
        vector<PII> v;
        int n,nmax=-inf,dn,nmin=inf,xn,ans=0;  cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            if(a[i]>nmax){
                dn=i;
                nmax=a[i];
            }
            if(a[i]<nmin){
                xn=i;
                nmin=a[i];
            }
        }
        if(abs(nmax)>abs(nmin)){
            for(int i=2;i<=n;i++){
                while(a[i]<a[i-1]){
                    a[i]+=nmax;
                    ans++;
                    v.push_back({i,dn});
                    if(a[i]>nmax){
                        dn=i;
                        nmax=a[i];
                    }
                }
            }
        }else{
            for(int i=n-1;i>0;i--){
                while(a[i]>a[i+1]){
                    a[i]+=nmin;
                    ans++;
                    v.push_back({i,xn});
                    if(a[i]<nmin){
                        xn=i;
                        nmin=a[i];
                    }
                }
            }
        }
        cout<<ans<<'\n';
        for(auto u:v){
            cout<<u.first<<' '<<u.second<<'\n';
        }
    }
    return 0;
}

D感觉像是一个背包问题:

#include<bits/stdc++.h>
using namespace std;
bitset<200001>dp;
main(){
	int n;cin>>n;
	dp[0]=1;int64_t t=0,ans=0;
	for(int i=0;i<n;i++){
		if(t<i)break;
		int64_t a;cin>>a;t+=a;
		if(dp[i])ans=max(ans,t-i);
		dp|=dp<<a;dp[i]=0;
	}
	for(int i=n-1;i<200001;i++)if(dp[i]){ans=max(ans,t-i);break;}
	cout<<ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codeforces1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值