CCPC-Wannafly Winter Camp Day4 (Div2, onsite)

D:node

/*
貪心的 構造出來歐拉回路
就是把度爲3的點改一改
方法是把4周的邊隔一個扔一個
這些扔掉的邊必定要走兩遍
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 1010
using namespace std;
int n,m,ans;
int main(){
    scanf("%d%d",&n,&m);n--;m--;
    if(n==1){
        ans=m*2+m+1+m-1;
        printf("%d\n",ans);return 0;
    }
    if(m==1){
        ans=n*2+n+1+n-1;
        printf("%d\n",ans);return 0;
    }
    ans+=n/2;
    if(n&1)ans+=m/2;
    else ans+=(m+1)/2;
    if((n+m)&1){
        ans+=(n+1)/2;
        if(n&1)ans+=(m+1)/2;
        else ans+=m/2;
    }
    else {
        ans+=n/2;
        if(n&1)ans+=m/2;
        else ans+=(m+1)/2;
    }
    ans+=n*(m+1)+m*(n+1);
    printf("%d\n",ans);
    return 0; 
}

I:ios

/*
首先,確定是用來打b的牌最後一塊出 
假設咱們已經肯定了有x張牌用來召喚怪獸
那麼對於一張牌 若是他用來打a那價值就是a
若是它用來打b那價值就是b*x
可是ab只能用一個 
因此這種能夠互相打破的價值不能用來作排序的key
咱們考慮 若是全都打b,那麼總價值是固定的
對於一張牌 改爲打a 總價值+a-b*x    
而後咱們取 這個值前x大的 
*/ 
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 1010
#define ll long long
using namespace std;
ll n,now,sumb,Ans;
struct node{
    ll a,b;
}r[maxn];
ll cmp(const node &A,const node &B){
    return (A.a-A.b*now)>(B.a-B.b*now);
}
int main(){
    scanf("%lld",&n);
    for(ll i=1;i<=n;i++){
        scanf("%lld%lld",&r[i].a,&r[i].b);
        sumb+=r[i].b;
    }
    for(now=1;now<=n;now++){
        sort(r+1,r+1+n,cmp);ll s=0;
        for(ll i=1;i<=now;i++)s+=r[i].a-r[i].b*now;
        Ans=max(Ans,sumb*now+s);
    }
    printf("%lld\n",Ans);
    return 0;
}

I:(div1)spa

/*
對於div1 的數據 枚舉x確定是gg了
而後就比較騷了
div2的程序枚舉x過程當中 
咱們發下ans是先增後減
大膽猜一發三分 
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 100010
#define ll long long
using namespace std;
ll n,now,sumb,Ans;
struct node{
    ll a,b;
}r[maxn];
ll cmp(const node &A,const node &B){
    return (A.a-A.b*now)>(B.a-B.b*now);
}
ll Cal(ll x){
    now=x;sort(r+1,r+1+n,cmp);ll s=0;
    for(ll i=1;i<=now;i++)s+=r[i].a-r[i].b*now;
    Ans=max(Ans,sumb*now+s);return sumb*now+s;
}
int main(){
    scanf("%lld",&n);
    for(ll i=1;i<=n;i++){
        scanf("%lld%lld",&r[i].a,&r[i].b);
        sumb+=r[i].b;
    }
    ll l=0,r=n,m1,m2,a1,a2;
    while(l<=r){
        m1=(l+r)/2;m2=(m1+r)/2;
        a1=Cal(m1);a2=Cal(m2);
        if(a1>a2)r=m2-1;
        else l=m1+1;
    }
    printf("%lld\n",Ans);
    return 0;
} 
相關文章
相關標籤/搜索