Codeforces Round #748 (Div. 3)

A. Elections

题目:

思路分析:

题意就是3个人有自己的分数  那么各自要增加多少分才能比其他二个人分数都高呢

代码实现:

#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<list>
#include<set>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<sstream>
#include<algorithm>

using namespace std;
typedef long long  ll;
#define re register //局部
#define PI atan(1.0)*4
#define ull unsigned long long
#define scf(n) scanf("%d",&n)
#define scfl(n) scanf("%lld",&n)
#define prf(n) printf("%d",n)
#define prfl(n) printf("%lld",n)
#define scfd(n) scanf("%lf",&n)
#define prfd(n) printf("%.lf",n)
#define prf10(n) printf("%.10f",n)
#define ls (rt<<1)
#define rs (rt<<1|1)
//#define mid (l+r)/2
#define mms(x, y) memset(x, y, sizeof x)
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
const int INF = 0x3f3f3f3f;
const double EPS=1e-10;
const double Pi=3.1415926535897;
using namespace std;


const int MAX=2e5+10;

int t;
ll a,b,c;
int main(){
    cin>>t;
    while (t--) {
        cin>>a>>b>>c;
        ll x=-0x3f3f3f3f;
        x=max(x,a);
        x=max(x,b);
        x=max(x,c);
        int id=1;
        int sum=0;
        if(a==x){
            sum++;
        }
        if(b==x){
            sum++;
            id=2;
        }
        if(c==x){
            sum++;
            id=3;
        }
        if(sum==3){
            cout<<1<<" "<<1<<" "<<1<<endl;
        }
        else if(sum==2){
            if(a==x){
                cout<<1<<" ";
            }
            else cout<<x-a+1<<" ";
            if(b==x){
                cout<<1<<" ";
            }
            else cout<<x-b+1<<" ";
            if(c==x){
                cout<<1<<endl;
            }
            else cout<<x-c+1<<endl;
        }
        else if(sum==1){
            if(id==1){
                cout<<0<<" "<<x+1-b<<" "<<x+1-c<<endl;
            }
            else if(id==2){
                cout<<x+1-a<<" "<<0<<" "<<x+1-c<<endl;
            }
            else {
                cout<<x+1-a<<" "<<x+1-b<<" "<<0<<endl;
            }
        }
    }
}

C. Save More Mice

题目:

思路分析:

题意就是给定终点 和每个人的坐标点

然后贪心法 我们要使到达终点的人最多就是先把坐标排序 让离终点最近的人先到达就行

然后时间为n 计算就行 

代码实现:

#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<list>
#include<set>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<sstream>
#include<algorithm>

using namespace std;
typedef long long  ll;
#define re register //局部
#define PI atan(1.0)*4
#define ull unsigned long long
#define scf(n) scanf("%d",&n)
#define scfl(n) scanf("%lld",&n)
#define prf(n) printf("%d",n)
#define prfl(n) printf("%lld",n)
#define scfd(n) scanf("%lf",&n)
#define prfd(n) printf("%.lf",n)
#define prf10(n) printf("%.10f",n)
#define ls (rt<<1)
#define rs (rt<<1|1)
//#define mid (l+r)/2
#define mms(x, y) memset(x, y, sizeof x)
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
const int INF = 0x3f3f3f3f;
const double EPS=1e-10;
const double Pi=3.1415926535897;
inline int read() {
    int x=0,f=1; char c=getchar();
    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;
}
using namespace std;


const int MAX=4e5+10;
ll a[MAX];
int t;
ll n;
int k;
int main(){
    t=read();
    while (t--) {
        n=read();
        k=read();
        for(int i=0;i<k;i++) cin>>a[i];
        sort(a,a+k);
        ll now=n;
        ll ans=0;
        for(ll  i=k-1;i>=0;i--){
            if(now>n-a[i]){
                now-=(n-a[i]);
                ans++;
//                cout<<now<<" "<<a[i]<<endl;
            }
            else break;
        }
        
        cout<<ans<<endl;
    }
}

D1. All are Same

题目:

思路分析:

题意就是给定一组数据然后通过一系列操作可以对每个数都减去k

最后让他们全部相等

求这个最大可能数

可以直接暴力过 最大边界就是 最大数-最小数 然后遍历

还可以从 最大数-最小数 为结果然后对每个数-目标值 与其求gcd

如果最后ans为0那就无法实现

代码实现:

#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<list>
#include<set>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<sstream>
#include<algorithm>

using namespace std;
typedef long long  ll;
#define re register //局部
#define PI atan(1.0)*4
#define ull unsigned long long
#define scf(n) scanf("%d",&n)
#define scfl(n) scanf("%lld",&n)
#define prf(n) printf("%d",n)
#define prfl(n) printf("%lld",n)
#define scfd(n) scanf("%lf",&n)
#define prfd(n) printf("%.lf",n)
#define prf10(n) printf("%.10f",n)
#define ls (rt<<1)
#define rs (rt<<1|1)
//#define mid (l+r)/2
#define mms(x, y) memset(x, y, sizeof x)
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
const int INF = 0x3f3f3f3f;
const double EPS=1e-10;
const double Pi=3.1415926535897;
inline int read() {
    int x=0,f=1; char c=getchar();
    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;
}

int gcd(int m, int n){return n == 0 ? m : gcd(n, m%n);}

using namespace std;




const int MAX=45;
int a[MAX];
int t;
int n;
void solve(){
    cin>>n;
    
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    sort(a,a+n);
    int ans=a[n-1]-a[0];
    for(int i=0;i<n;i++){
        if(a[i]!=a[0]) ans=gcd(ans,a[i]-a[0]);
    }
    if(ans==0) {cout<<-1<<endl;return;}
    cout<<ans<<endl;
}
int main(){
    cin>>t;
    while (t--) {
        solve();
    }
}

E. Gardener and Tree

题目:

 

思路分析:

就是给你也可无根树 然后每次操作都要剪去其叶节点 问k次操作以后 还剩多少个节点

我们可以利用拓扑排序的思路

记录下每个节点的度 然后先将度为1的点放入队列中 然后bfs删除与其相连的边并检测其度如果为1那么删除节点放入队列中  同时维护bfs的层数 注意要剪枝 操作数为k 

代码实现:


#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<list>
#include<set>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<sstream>
#include<algorithm>

using namespace std;
typedef long long  ll;
#define re register //局部
#define PI atan(1.0)*4
#define ull unsigned long long
#define scf(n) scanf("%d",&n)
#define scfl(n) scanf("%lld",&n)
#define prf(n) printf("%d",n)
#define prfl(n) printf("%lld",n)
#define scfd(n) scanf("%lf",&n)
#define prfd(n) printf("%.lf",n)
#define prf10(n) printf("%.10f",n)
#define ls (rt<<1)
#define rs (rt<<1|1)
//#define mid (l+r)/2
#define mms(x, y) memset(x, y, sizeof x)
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
const int INF = 0x3f3f3f3f;
const double EPS=1e-10;
const double Pi=3.1415926535897;
inline int read() {
    int x=0,f=1; char c=getchar();
    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;
}

int gcd(int m, int n){return n == 0 ? m : gcd(n, m%n);}

using namespace std;




const int MAX=4e5+10;
int t;
int n,k;
vector<int>v[MAX<<1];
int in[MAX];
int vis[MAX];
void solve(){
    cin>>n>>k;
    int ans=0;
    for(int i=1;i<=n;i++){
        v[i].clear();
    }
    mms(vis,0);
    mms(in,0);
    for(int i=0;i<n-1;i++){
        int a,b;
        cin>>a>>b;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    for(int i=1;i<=n;i++){
        in[i]=v[i].size();
    }
    queue<int>q;
    for(int i=1;i<=n;i++){
        if(in[i]<=1){ //debug1
            q.push(i);
            ans++;
            vis[i]=1;
        }
    }
    while (!q.empty()) {
        int p=q.front();
        q.pop();
        if(vis[p]>=k) continue;
        for(int i=0;i<v[p].size();i++){
            int u=v[p][i];
            if(vis[u]) continue;
            in[u]--;
            if(in[u]==1){
                vis[u]=vis[p]+1;
                ans++;
                q.push(u);
            }
        }
    }
    cout<<n-ans<<endl;
}
int main(){
    cin>>t;
    while (t--) {
        solve();
    }
    return 0;
}

B. Make it Divisible by 25

题目:

思路分析:

就是给你一个数字 经过一系列操作让其可以被25整除

我们知道可以被25整除的数 末尾2为 只能是 00 25 50 75

那么我们可以先找到0 然后往前找0或者5 记录0或5的下标

也可以先找到5 然后往前找2或者5 记录2或5的下标

他的代价就是n-i-2

取最小就行

代码实现:


#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<list>
#include<set>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<sstream>
#include<algorithm>

using namespace std;
typedef long long  ll;
#define re register //局部
#define PI atan(1.0)*4
#define ull unsigned long long
#define scf(n) scanf("%d",&n)
#define scfl(n) scanf("%lld",&n)
#define prf(n) printf("%d",n)
#define prfl(n) printf("%lld",n)
#define scfd(n) scanf("%lf",&n)
#define prfd(n) printf("%.lf",n)
#define prf10(n) printf("%.10f",n)
#define ls (rt<<1)
#define rs (rt<<1|1)
//#define mid (l+r)/2
#define mms(x, y) memset(x, y, sizeof x)
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
const int INF = 0x3f3f3f3f;
const double EPS=1e-10;
const double Pi=3.1415926535897;
inline int read() {
    int x=0,f=1; char c=getchar();
    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;
}

int gcd(int m, int n){return n == 0 ? m : gcd(n, m%n);}

using namespace std;




const int MAX=4e5+10;
int t;
void solve(){
    string s;
    cin>>s;
    int a,b;
    int l=-1;
    int r=-1;
    for(int i=s.size()-1;i>=0;i--){
        if(r==-1&&s[i]=='0'){
            r=i;
            continue;
        }
        if(r!=-1&&(s[i]=='0'||s[i]=='5')){
            l=i;
            break;
        }
    }
    int n=s.size();
    a=n-l-2;
    l=-1;
    r=-1;
    for(int i=s.size()-1;i>=0;i--){
        if(r==-1&&s[i]=='5'){
            r=i;
            continue;
        }
        if(r!=-1&&(s[i]=='2'||s[i]=='7')){
            l=i;
            break;
        }
    }
    b=n-l-2;
//    cout<<a<<" "<<b<<endl;
    cout<<min(a,b)<<endl;
    
}
int main(){
    cin>>t;
    while (t--) {
        solve();
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

郭晋龙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值