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;
}