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