1042591643算法交流群

Codeforces Round #643 (Div. 2) 传送门 传送刷题open

A Sequence with Digits 水题
暴力构造就好了 搞出一个0就输出就行 题意要求 元素x 加上 她的最小数位*最高数位 只要最小等于0 就会一直0

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define mods 1000000007
#define modd 998244353
#define PI acos(-1)
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mp make_pair
#define pb push_back
#define si size()
#define E exp(1.0)
#define fixed cout.setf(ios::fixed)
#define fixeds(x) setprecision(x)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
 using namespace std;
inline ll read(){
    
    char c=getchar();ll f=1,x=0;while(c<'0'||c>'9'){
    
    if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){
    
    x=(x<<1)+(x<<3)+(c^'0');c=getchar();}return x*f;}
ll gcd(ll a,ll b){
    
     return b==0?a:gcd(b,a%b);}//最大公因数
ll lcm(ll a,ll b){
    
    return a/__gcd(a,b)*b;}
ll qp(ll a,ll b, ll p){
    
    ll ans = 1;a%=p;while(b){
    
    if(b&1){
    
    ans = (ans*a)%p;--b;}a =(a*a)%p;b >>= 1;}return ans%p;}//逆元   (分子*qp(分母,mod-2,mod))%mod;
long long mode(long long a,long long b,long long mod)
{
    
    
    long long ans=1;
 if(b==0){
    
    return ans%mod;}
    while(b)
    {
    
    
        if(b%2==1)
        {
    
    b--;ans=ans*a%mod;}
        a=a*a%mod;
        b=b/2;
    }
    return ans;
}//快速幂%
/*最小公倍数lcm(a,b)=a*b/gcd(a,b);
gcd(ka,kb)=k*gcd(a,b);
gcd(s/a,s/b)=s/gcd(a,b);
gcd(x^a-1,x^b-1)=x^gcd(a,b)-1;
gcd(f[a],f[b])=f[gcd(a,b)];
lcm(ka,kb)=k*lcm(a,b);
lcm(f[a],f[b])=f[lcm(a.b)];*/

void prime(ll n){
    
    
vector<ll>v;//用的时候记得拿出去
ll tmp = n;
if(n % 2 == 0) {
    
    
v.push_back(2);
while (n % 2 == 0) {
    
    
n /= 2;
}}for(ll i = 3; i * i <= tmp; i += 2){
    
    
if(n % i == 0) {
    
    
v.push_back(i);
}
while(n % i == 0){
    
    
n /= i;
}}if(n > 2)
v.push_back(n);
}

const int manx=1e3+5;
const int N=1e6+5;
 
ll do1(ll x){
    
    
    ll ans=9;
    while(x){
    
    
        if(x%10<ans)  ans=x%10;
        x/=10;
    }
    return ans;
}
ll do2(ll x){
    
    
    ll ans=0;
    while(x){
    
    
        if(x%10>ans)  ans=x%10;
        x/=10;
    }
    return ans;
}
 
int main(){
    
    
    ll t=read();
    while(t--){
    
    
        ll a,b; 
        a=read();
        b=read();
        for(int i=1;i<b;i++){
    
    
            ll x=do1(a),y=do2(a);
            a=a+x*y;
            if(x==0) break;
        }
        cout<<a<<endl;
    }
    return 0;
}

B 题 Young Explorers 传送门
水题 记得初始化

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define mods 1000000007
#define modd 998244353
#define PI acos(-1)
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mp make_pair
#define pb push_back
#define si size()
#define E exp(1.0)
#define fixed cout.setf(ios::fixed)
#define fixeds(x) setprecision(x)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
 using namespace std;
inline ll read(){
    
    char c=getchar();ll f=1,x=0;while(c<'0'||c>'9'){
    
    if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){
    
    x=(x<<1)+(x<<3)+(c^'0');c=getchar();}return x*f;}
ll gcd(ll a,ll b){
    
     return b==0?a:gcd(b,a%b);}//最大公因数
ll lcm(ll a,ll b){
    
    return a/__gcd(a,b)*b;}
ll qp(ll a,ll b, ll p){
    
    ll ans = 1;a%=p;while(b){
    
    if(b&1){
    
    ans = (ans*a)%p;--b;}a =(a*a)%p;b >>= 1;}return ans%p;}//逆元   (分子*qp(分母,mod-2,mod))%mod;
long long mode(long long a,long long b,long long mod)
{
    
    
    long long ans=1;
 if(b==0){
    
    return ans%mod;}
    while(b)
    {
    
    
        if(b%2==1)
        {
    
    b--;ans=ans*a%mod;}
        a=a*a%mod;
        b=b/2;
    }
    return ans;
}//快速幂%
/*最小公倍数lcm(a,b)=a*b/gcd(a,b);
gcd(ka,kb)=k*gcd(a,b);
gcd(s/a,s/b)=s/gcd(a,b);
gcd(x^a-1,x^b-1)=x^gcd(a,b)-1;
gcd(f[a],f[b])=f[gcd(a,b)];
lcm(ka,kb)=k*lcm(a,b);
lcm(f[a],f[b])=f[lcm(a.b)];*/

void prime(ll n){
    
    
vector<ll>v;//用的时候记得拿出去
ll tmp = n;
if(n % 2 == 0) {
    
    
v.push_back(2);
while (n % 2 == 0) {
    
    
n /= 2;
}}for(ll i = 3; i * i <= tmp; i += 2){
    
    
if(n % i == 0) {
    
    
v.push_back(i);
}
while(n % i == 0){
    
    
n /= i;
}}if(n > 2)
v.push_back(n);
}
const int manx=1e3+5;
const int N=1e6+5;
 
ll a[N],b[N];
 
int main(){
    
    
   
   ll t=read();
    while(t--){
    
    
        ll n=read(); ll m=0;
        for(int i=1;i<=n;i++){
    
    
            ll x=read();
            if(!b[x]) a[++m]=x;
            b[x]++;
        }
        sort(a+1,a+1+m);
        ll ans=0,res=0;
        for(int i=1;i<=m;i++){
    
    
            ans+=b[a[i]]/a[i];
            res+=b[a[i]]%a[i];
            if(res>=a[i]){
    
    
                ans+=res/a[i];
                res%=a[i];
            }
        }
        cout<<ans<<endl;
        for(int i=1;i<=n;i++) b[i]=0;
    }
    return 0;
}

C Count Triangles 传送门
题目给你A B C D四个数 然后给你x y z三角形三个边 问你能够组合成多少种三角形 ,按照ABCD的范围
在这里插入图片描述
有一种思路就是枚举两边之和 然后去算第三条边(z)的贡献
z边区间 【C,D】 因为x+y>z 所以 (x+y)min=C+1 (x+y)max=D+1
一个循环枚举两边之和 计算出x边的最小值和最大值 ,x区间范围确定了与之对应的y也就确定下来了 然后计算z边的合法区间长度 做乘法就是每轮的贡献值

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define mods 1000000007
#define modd 998244353
#define PI acos(-1)
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mp make_pair
#define pb push_back
#define si size()
#define E exp(1.0)
#define fixed cout.setf(ios::fixed)
#define fixeds(x) setprecision(x)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
 using namespace std;
inline ll read(){
    
    char c=getchar();ll f=1,x=0;while(c<'0'||c>'9'){
    
    if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){
    
    x=(x<<1)+(x<<3)+(c^'0');c=getchar();}return x*f;}
ll gcd(ll a,ll b){
    
     return b==0?a:gcd(b,a%b);}//最大公因数
ll lcm(ll a,ll b){
    
    return a/__gcd(a,b)*b;}
ll qp(ll a,ll b, ll p){
    
    ll ans = 1;a%=p;while(b){
    
    if(b&1){
    
    ans = (ans*a)%p;--b;}a =(a*a)%p;b >>= 1;}return ans%p;}//逆元   (分子*qp(分母,mod-2,mod))%mod;
long long mode(long long a,long long b,long long mod)
{
    
    
    long long ans=1;
 if(b==0){
    
    return ans%mod;}
    while(b)
    {
    
    
        if(b%2==1)
        {
    
    b--;ans=ans*a%mod;}
        a=a*a%mod;
        b=b/2;
    }
    return ans;
}//快速幂%
/*最小公倍数lcm(a,b)=a*b/gcd(a,b);
gcd(ka,kb)=k*gcd(a,b);
gcd(s/a,s/b)=s/gcd(a,b);
gcd(x^a-1,x^b-1)=x^gcd(a,b)-1;
gcd(f[a],f[b])=f[gcd(a,b)];
lcm(ka,kb)=k*lcm(a,b);
lcm(f[a],f[b])=f[lcm(a.b)];*/

void prime(ll n){
    
    
vector<ll>v;//用的时候记得拿出去
ll tmp = n;
if(n % 2 == 0) {
    
    
v.push_back(2);
while (n % 2 == 0) {
    
    
n /= 2;
}}for(ll i = 3; i * i <= tmp; i += 2){
    
    
if(n % i == 0) {
    
    
v.push_back(i);
}
while(n % i == 0){
    
    
n /= i;
}}if(n > 2)
v.push_back(n);
}
int  main()
{
    
    
	ll a , b , c , d;
    a=read();
    b=read();
    c=read();
    d=read();
	ll ans = 0;
	for(ll i=c+1;i<=c+d;i++)
	{
    
    
		ll l = max(a , i - c);
		ll r = min(b , i - b);
		if(r < l) continue;
		ans += (r - l + 1) * (min(d + 1 , i) - c);
	}
	printf("%lld\n",ans);
}

D Game With Array 传送门
一个思维的构造题
给你一个数组的长度n 也就是包含了a[1] ----- a[n] 然后累加和为s
现在有两个人 挖沙和皮特
定义挖沙能赢(输出NO) 对于长度为n的数组 无论怎么构造 无论k选[0,s] 他都能找一个非空数组 其和等于s-k || k
定义 皮特赢 (输出YES) 就是上面那种相反的情况 要求输出构造的数组的元素以及k
我个人的想法是 大概是个博弈题(其实我不懂博弈)
构造题 特殊化构造 事半功倍
我们来构造长度为n的数组 n-1个1 第n个元素就是s-(n-1) 记为sum
那么一定可以取到的元素区间是[1,n-1] 和[1+sum,sum+n-1] 如果两个区间并 包含了[1,s] 一定是no 做个标记就好了 标记1 是可以取到的

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define mods 1000000007
#define modd 998244353
#define PI acos(-1)
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mp make_pair
#define pb push_back
#define si size()
#define E exp(1.0)
#define fixed cout.setf(ios::fixed)
#define fixeds(x) setprecision(x)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
 using namespace std;
inline ll read(){
    
    char c=getchar();ll f=1,x=0;while(c<'0'||c>'9'){
    
    if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){
    
    x=(x<<1)+(x<<3)+(c^'0');c=getchar();}return x*f;}
ll gcd(ll a,ll b){
    
     return b==0?a:gcd(b,a%b);}//最大公因数
ll lcm(ll a,ll b){
    
    return a/__gcd(a,b)*b;}
ll qp(ll a,ll b, ll p){
    
    ll ans = 1;a%=p;while(b){
    
    if(b&1){
    
    ans = (ans*a)%p;--b;}a =(a*a)%p;b >>= 1;}return ans%p;}//逆元   (分子*qp(分母,mod-2,mod))%mod;
long long mode(long long a,long long b,long long mod)
{
    
    
    long long ans=1;
 if(b==0){
    
    return ans%mod;}
    while(b)
    {
    
    
        if(b%2==1)
        {
    
    b--;ans=ans*a%mod;}
        a=a*a%mod;
        b=b/2;
    }
    return ans;
}//快速幂%
/*最小公倍数lcm(a,b)=a*b/gcd(a,b);
gcd(ka,kb)=k*gcd(a,b);
gcd(s/a,s/b)=s/gcd(a,b);
gcd(x^a-1,x^b-1)=x^gcd(a,b)-1;
gcd(f[a],f[b])=f[gcd(a,b)];
lcm(ka,kb)=k*lcm(a,b);
lcm(f[a],f[b])=f[lcm(a.b)];*/

void prime(ll n){
    
    
vector<ll>v;//用的时候记得拿出去
ll tmp = n;
if(n % 2 == 0) {
    
    
v.push_back(2);
while (n % 2 == 0) {
    
    
n /= 2;
}}for(ll i = 3; i * i <= tmp; i += 2){
    
    
if(n % i == 0) {
    
    
v.push_back(i);
}
while(n % i == 0){
    
    
n /= i;
}}if(n > 2)
v.push_back(n);
}
ll a[1000009];
ll b[1000009];
int main(){
    
    

ll n=read();
ll s=read();
ll add=n-1;//全是1
ll sum=s-add;//特殊数字
ll flag=0;
if(n==1){
    
    
    if(s==1){
    
    
         printf("NO\n");
    return 0;
    }

    printf("YES\n");
    printf("%lld\n",s);
    printf("%lld\n",s-1);
    return 0;
}
for(int i=1;i<=add;i++){
    
    
    b[i]=1;
}
for(int i=sum;i<=sum+add;i++){
    
    
    b[i]=1;
}
for(int i=1;i<=sum+add;i++){
    
    
    if(b[i]==0){
    
    
        flag=1;
        break;
    }
}
if(flag==0){
    
    
    printf("NO\n");
    return 0;
}
else{
    
    
        printf("YES\n");
for(int i=1;i<=n-1;i++){
    
    
    a[i]=1;
    a[i+sum]=1;
    printf("1 ");
}
a[sum]=1;
printf("%lld\n",sum);
//printf("%lld",add);
for(int i=n;i<=n-1+sum+9;i++){
    
    
    if(a[i]==0){
    
    
        printf("%d",i);
        break;
    }
}
}

return 0;
}

当然有小伙伴有更简介的写法欢迎下面留言

E Restorer Distance 一个裸三分题
因为 一定存在最小值 遇事不决先sort 如果高度为最低的柱子或者高度为最高的柱子 肯定花费大于等于中间的某个点 这样就是开口向下的函数
如果a+r<m 就没有必要进行这种操作
然后就是计算出每个柱子补到x 的高度差之和
mi 就是小于x的高度差之和 ma就是大于x 与x的高度差之和
如果使用m的话 就是min(mi,ma)*m然后加上多余的部分
三分处理一下 然后算贡献
分类讨论三种价值 对应的贡献

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define mods 1000000007
#define modd 998244353
#define PI acos(-1)
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define mp make_pair
#define pb push_back
#define si size()
#define E exp(1.0)
#define fixed cout.setf(ios::fixed)
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define fixeds(x) setprecision(x)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
 using namespace std;
inline ll read(){
    
    char c=getchar();ll f=1,x=0;while(c<'0'||c>'9'){
    
    if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){
    
    x=(x<<1)+(x<<3)+(c^'0');c=getchar();}return x*f;}
ll gcd(ll a,ll b){
    
     return b==0?a:gcd(b,a%b);}//最大公因数
ll lcm(ll a,ll b){
    
    return a/__gcd(a,b)*b;}
ll qp(ll a,ll b, ll p){
    
    ll ans = 1;a%=p;while(b){
    
    if(b&1){
    
    ans = (ans*a)%p;--b;}a =(a*a)%p;b >>= 1;}return ans%p;}//逆元   (分子*qp(分母,mod-2,mod))%mod;
long long mode(long long a,long long b,long long mod)
{
    
    
    long long ans=1;
 if(b==0){
    
    return ans%mod;}
    while(b)
    {
    
    
        if(b%2==1)
        {
    
    b--;ans=ans*a%mod;}
        a=a*a%mod;
        b=b/2;
    }
    return ans;
}//快速幂%
/*最小公倍数lcm(a,b)=a*b/gcd(a,b);
gcd(ka,kb)=k*gcd(a,b);
gcd(s/a,s/b)=s/gcd(a,b);
gcd(x^a-1,x^b-1)=x^gcd(a,b)-1;
gcd(f[a],f[b])=f[gcd(a,b)];
lcm(ka,kb)=k*lcm(a,b);
lcm(f[a],f[b])=f[lcm(a.b)];*/
vector<ll>v;//用的时候记得拿出去
void prime(ll n){
    
    

ll tmp = n;
if(n % 2 == 0) {
    
    
v.push_back(2);
while (n % 2 == 0) {
    
    
n /= 2;
}}for(ll i = 3; i * i <= tmp; i += 2){
    
    
if(n % i == 0) {
    
    
v.push_back(i);
}
while(n % i == 0){
    
    
n /= i;
}}if(n > 2)
v.push_back(n);
}


const int manx=1e3+5;
const int N=1e6+5;

ll n,a,r,m;
ll h[N];
ll l=1,rr=0;

ll check(ll x){
    
    
    ll ans=0;
    if(m>=a+r){
    
    
        for(int i=1;i<=n;i++){
    
    
            if(h[i]>x) ans+=(h[i]-x)*r;
            if(h[i]<x) ans+=(x-h[i])*a;
        }
    }
    else{
    
    
        ll mi=0,ma=0;
        for(int i=1;i<=n;i++){
    
    
            if(h[i]>x) ma+=h[i]-x;
            if(h[i]<x) mi+=x-h[i];
        }
        ll ms=min(mi,ma);
        ans+=ms*m;
        ans+=(mi-ms)*a;
        ans+=(ma-ms)*r;
    }
    return ans;
}

int main(){
    
    

    n=read();
    a=read();
    r=read();
    m=read();
    for(int i=1;i<=n;i++) h[i]=read();
    sort(h+1,h+1+n);
     rr=h[n];
    ll x=1e18;
    while(l<=rr){
    
    
        ll lm=l+(rr-l)/3,rm=rr-(rr-l)/3;
        ll w1=check(lm),w2=check(rm);
        x=min(w1,x); x=min(w1,x);
        if(w1<=w2) rr=rm-1;
        else l=lm+1;
    }
    cout<<x;
    return 0;
}


猜你喜欢

转载自blog.csdn.net/weixin_45948940/article/details/106166927