Codeforces Round #667 (Div. 3) A-B-C

Codeforces Round #667 (Div. 3)

A. Yet Another Two Integers Problem

问题分析:

就是简单的暴力枚举
从 10依次往下扫

AC代码:

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<sstream>
#include<algorithm>
using namespace std;
#define ll long long
#define mem(a,b) memset((a),(b),sizeof(a));
const ll inf=0x3f3f3f3f;//1061109567,2*未超int,allinf=mem(a,0x3f,sizeof(a));
const int N=2e5+10;
int main(){
       // #define io
#ifdef io
        freopen("in.txt","r",stdin);
#endif
        int n;
        cin>>n;
        for(int i=0;i<n;i++){
                ll ans=0;
                ll a,b;
                cin>>a>>b;
                ll xx=abs(a-b);
                for(int i=10;i>=1;i--){
                        int m=xx/i;
                        if(m!=0){
                                xx-=i*m;
                                ans+=m;
                        }
                }
        cout<<ans<<endl;
        }
        return 0;
}

B. Minimum Product

问题分析:

因为最后是2个数的乘积
2个数都尽量小最终乘积才会最小
因为规则限制 所以 2个数变化要有一个先后顺序 并且他们也有各自的最小值

枚举两种情况 : 第一个先到规定的最小值,第二个跟着
第二个 先到,第一个跟着
然后取出他们乘积中较大的
具体看代码实例

AC代码:

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<sstream>
#include<algorithm>
using namespace std;
#define ll long long
#define mem(a,b) memset((a),(b),sizeof(a));
const ll inf=0x3f3f3f3f;//1061109567,2*未超int,allinf=mem(a,0x3f,sizeof(a));
const int N=2e5+10;
int main(){
       // #define io
#ifdef io
        freopen("in.txt","r",stdin);
#endif
        int n;
        cin>>n;
        while(n--){
                ll a,b,x,y,z;
                cin>>a>>b>>x>>y>>z;
                ll mi;
                ll ax=max(a-z,x);//取最大值,2个限制
                ll by=max(b-z+a-ax,y);
                mi=ax*by;//枚举第一种情况
                by=max(b-z,y);
                ax=max(a-z+b-by,x);
                mi=min(mi,by*ax);//第二种,并取二者的最小值
                cout<<mi<<endl;
        }
        return 0;
}

C. Yet Another Array Restoration

问题分析:

给与条件 一个项数,2个数组的中的2个数 ,每两项差值相等且>0,也就是一个 公差为正数等差数列
要使得数组整体比较小 就要保证 在项数尽可能多的情况下,公差尽可能的小
我是 通过2个数 然后 枚举2个数中间的 项数 当然是 从项数最多开始枚举
然后 枚举的第一个合适的就是所需的 项数
然后 通过 这个项数,以及2个数求出公差
然后通过公差 和第一个数 往前递推找到 最开始的呢个数
这里 需要注意 最开始的数可能 不一定就是 不够公差减少(具体看举例,说的有点模糊)
2 4 6 8 10 12 14 16 (已知条件: 5 8 12)这样答案 就是 4 6 8 10 12 并不是从 2 开始的
相关公式 见代码解析//

AC代码:

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<sstream>
#include<algorithm>
using namespace std;
#define ll long long
#define mem(a,b) memset((a),(b),sizeof(a));
const ll inf=0x3f3f3f3f;//1061109567,2*未超int,allinf=mem(a,0x3f,sizeof(a));
const int N=2e5+10;
int main(){
       // #define io
#ifdef io
        freopen("in.txt","r",stdin);
#endif
        int n;
        cin>>n;
        while(n--){
                int k,x,y;
                cin>>k>>x>>y;
                int i;
                int s=y-x;
                for(i=k-2;i>=1;i--){//首尾2项:k-2
                        if(s%(i+1)==0){//因为差值是 2个数产生 也就相当于空挡 项数-1
                        //所以相当于 i+1
                                break;
                        }
                }
                        int xx=(y-x)/(i+1);//获取公差
                        int ff=x;
                        for(int j=x;j>=1;j-=xx){//获取首项
                                ff=j;
                        }
                        if((y-ff)/xx+1>k){//尾数限制 项数,导致首项不符合条件
                        /*
                        ff+(xx*(k-1))=y
                        --->ff=y-(xx*(k-1));
                        */
                                ff=y-(xx*(k-1));
                        }
                        for(int i=0;i<k;i++){
                                cout<<ff<<" ";
                                ff+=xx;
                        }
                        cout<<endl;
        }
        return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值