(事業部の定格。2)CF-教育Codeforcesラウンド77(AE题解)

A.暖房(水問題)

トピックリンク

一般的な考え方:

あなたは、各部屋の平均サイズ、1個以下の、すなわち最大値と最小値の違いを作ることができますので、それは、広場を犠牲にしているので。

コード:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n;
int main()
{
    //freopen("H:\\c++1\\in.txt","r",stdin);
    //freopen("H:\\c++1\\out.txt","w",stdout);
    ll c,sum;
    scanf("%lld",&n);
    while(n--){
        scanf("%lld%lld",&c,&sum);
        ll s=sum/c,yu=sum%c,ans=0;
        //cout<<s<<" "<<yu<<endl;
        for(int i=1;i<=min(c,sum);i++){
            if(yu){
                ans+=(s+1)*(s+1);yu--;
            }else{
                ans+=(s)*(s);
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}

B.入手二つのゼロ(結論を探してください)

トピックリンク

一般的な考え方:

最初は観察され((0,0)\)\それがプラスので、も可能で、それは状態に移行することができ、状態が可能である(X、2X \)\次に、\((B)\ )\(+ bは\)でなければなりません(\ 3 \)倍数が、これが唯一の必要条件であるが、また、多数の小型の二倍の数を超えることはできませんことを知って、それは正確には十分ではありませんが、あまりにもすることができます。

コード:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    //freopen("H:\\c++1\\in.txt","r",stdin);
    //freopen("H:\\c++1\\out.txt","w",stdout);
    int n,a,b;
    scanf("%d",&n);
    while(n--){
        scanf("%d%d",&a,&b);
        if((a+b)%3==0&&max(a,b)<=2*min(a,b)){
            puts("YES");
        }
        else puts("NO");

    }
    return 0;   
}

C.無限フェンス(数学)

トピックリンク

一般的な考え方:

仮定\(R&LT> B \)主として決定、((M1 * R、(\ \ M1 + 1)* R)) ほとんどのBに複数回現れます。だから、見つけるために\(M * B \%のR \) 値を知っている、最低である(GCD(B、R)\)\、その後、実際の裁判官で我々\(GCD(B、R) +(K -1)* B \)\(R&LT \)ライン上の関係。

コード:

#include<bits/stdc++.h>
#define ll long long
using namespace std;

ll gcd(ll a,ll b){
    return b==0?a:gcd(b,a%b);
}
ll T,r,b,k;
int main()
{
    //freopen("H:\\c++1\\in.txt","r",stdin);
    //freopen("H:\\c++1\\out.txt","w",stdout);
    scanf("%lld",&T);
    while(T--){
        scanf("%lld%lld%lld",&r,&b,&k);
        if(r==b){ // 特判一个相等的情况,不够其实不用好像
            puts("OBEY");continue;
        }
        if(r<b)swap(r,b);
        if(r%b==0){
            if(k*b<r){
                puts("REBEL");
            }else puts("OBEY");
            continue;
        }
        ll g=gcd(r,b);
        if(g+(k-1)*b<r){
            puts("REBEL");
        }else puts("OBEY");
    }
    return 0;
}

トラップとD. Aゲーム(半分貪欲+)

トピックリンク

一般的な考え方:

上半期のバンドの数が最も可能性の高い焦点が判断する方法で、判断し、次にしたい、とします。いずれにしても軍が歩かなければならい(\ 1 + N)\ステップを、我々は2つの鉱山のために、チューブに行くことができない((L_1、R_1)、(L_2、R_2)\)\あれば、(L_2 <= \ R_1は\) そして最良の方法は、一回に行くことです\(R_2 \) そうでない場合は、通常のシミュレーションをして、人々と戻ってきます。

コード:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N];
int n,m,k,t;
struct node{
    int l,r,d;
    node(int a=0,int b=0,int c=0){l=a,r=b,d=c;}
}lei[N];
vector<node>tt;
bool cmp(node a,node b){
    return a.l<b.l;
}
bool check(int x){
    tt.clear();
    int nl=a[x];
    for(int i=1;i<=k;i++)if(lei[i].d>nl)tt.push_back(lei[i]);//有危险的雷
    if(tt.size()==0)return 1;
    int ans=n+1,mx=0,now=tt[0].l-1;//部队行动距离必然要为n+1
    for(int i=0;i<int(tt.size());i++){
        mx=tt[i].r;
        int j=i+1;
        while(j<int(tt.size())&&tt[j].l<=mx)mx=max(mx,tt[j].r),j++;//有交集
        ans+=(mx-now)*2;
        now=tt[j].l-1;//更新
        i=j-1;
    }
    //cout<<x<<" "<<ans<<endl;
    if(ans<=t)return 1;//比较     
    else return 0;
}
int main()
{
    //freopen("H:\\c++1\\in.txt","r",stdin);
    //freopen("H:\\c++1\\out.txt","w",stdout);
    scanf("%d%d%d%d",&m,&n,&k,&t);
    for(int i=1;i<=m;i++)scanf("%d",&a[i]);
    sort(a+1,a+1+m);//按能力排序
    reverse(a+1,a+1+m);//降序
    for(int i=1;i<=k;i++){
        scanf("%d%d%d",&lei[i].l,&lei[i].r,&lei[i].d);
    }
    sort(lei+1,lei+1+k,cmp);//按l排序
    int ans=0,l=1,r=m;
    while(l<=r){//二分
        int mid=(l+r)/2;
        if(check(mid)){
            ans=mid;l=mid+1;
        }else r=mid-1;
    }
    printf("%d\n",ans);
    return 0;
}

E.トーナメント(貪欲)

トピックリンク

一般的な考え方:

私たちは、各ラウンドは、私たちの貪欲な戦略は、人々に多くの人々の可能性outとして多くの電力を作ることです、何人かの人々を排除することを、我々はコストを削減するだけでなく、中にできた\(K \)最初のラウンド、\(2 ^ k個-1 \)個人、彼らは排除されなければならないので、我々は戻ってから開始するので、我々は、選択することはできません、私たちのそれぞれは、ライン上で最小を過ごすために選択することもできます。

コード:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=(1<<20);
int n;
int a[N];
int vis[N];
multiset<int>s;
int main()
{
/*  freopen("H:\\c++1\\in.txt","r",stdin);
    freopen("H:\\c++1\\out.txt","w",stdout);
*/  scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int i=0;(1<<i)<=n;i++)vis[(1<<i)]=1;
    ll ans=0;
    for(int i=n;i>=1;i--){
        if(a[i]==-1)break;
        s.insert(a[i]);
        if(vis[i]){//选择可以选的代价最小的人
            ans+=*(s.begin());
            s.erase(s.begin());
        }
    }
    printf("%lld\n",ans);
    return 0;
}

おすすめ

転載: www.cnblogs.com/C-W-K/p/11962222.html