Educational Codeforces Round 171 (Div. 2)

zhouruoheng發表於2024-10-29

Educational Codeforces Round 171 (Div. 2)

A

猜結論,兩條邊的最小值最大時,兩條邊相等。所以取 \(min(x,y)\) 為邊長的正方形,對角線就是所求。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>

using namespace std;

int x,y,k;
void solve()
{
    cin>>x>>y>>k;
    int t=min(x,y);
    cout<<0<<' '<<0<<' '<<t<<' '<<t<<'\n';
    cout<<0<<' '<<t<<' '<<t<<' '<<0<<'\n';
}
int main ()
{
    #ifndef ONLINE_JUDGE 
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    #endif
    int T;
    cin>>T;
    while(T--) solve();
    return 0;
}

B

賽時罰時吃爽了 qwq。

首先若 \(n\) 為偶數,必須是兩兩匹配塗黑的,不能有列表外的被塗黑。塗 \((1,2)\)\((3,4)\)\((5,6)\) 等等。在這些的差值取最大就是 \(k\)

\(n\) 為奇數,那麼就是能且必須有一個數不是和列表中的數匹配塗黑,列舉這個數 \(i\),將陣列分為兩部分 \((1,i-1)\)\((i+1,n)\),和 \(n\) 為偶數的情況一樣考慮兩部分。\(O(n^2)\) 複雜度完全可以。

一開始認為奇數情況下只能讓開頭和末尾的和其他的數塗黑 qwq。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>

using namespace std;
typedef long long ll;
const int N=2005;
const ll inf=1e18;
int n;
ll a[N];

void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    ll ans=inf;
    if(n&1)
    {
        ll ans=inf;
        for(int i=1;i<=n;i+=2)
        {
            ll mx=0;
            for(int j=1;j<i;j+=2) mx=max(mx,a[j+1]-a[j]);
            for(int j=i+1;j<=n;j+=2) mx=max(mx,a[j+1]-a[j]);
            ans=min(ans,mx);
        }
        cout<<max(1ll,ans)<<'\n';
    }   
    else 
    {
        ll mx=0;
        for(int i=2;i<=n;i+=2) mx=max(mx,a[i]-a[i-1]);
        cout<<mx<<'\n';
    } 
}
int main ()
{
    #ifndef ONLINE_JUDGE 
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    #endif
    int T;
    cin>>T;
    while(T--) solve();
    return 0;
}

C

首先肯定要貪心考慮,儘可能優惠後面的商品,儘可能多的優惠。

等於 \(0\) 的商品肯定不能優惠,因為可以有更優的選擇。

\(0\)\(1\) 分開,用雙端佇列存 \(1\) 的位置,每次取隊尾,然後肯定是有 \(0\) 就用 \(0\) 的位置出現的商品和當前的拼起來優惠,否則取隊首的 \(1\)。如果都沒有的話就不能優惠。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
typedef long long ll;
const int N=4e5+5;
int n;
string s;
deque<int> dq;
int st[N],tot;
ll ans;
void solve()
{
    cin>>n;
    cin>>s;
    tot=ans=0;
    for(int i=0;i<n;i++) 
    {
        if(s[i]-'0') dq.push_back(i+1);
        else st[++tot]=i+1;
        ans+=i+1;
    }
    while(dq.size())
    {
        int x=dq.back();dq.pop_back();
        while(tot&&st[tot]>x) tot--;
        if(tot) 
        {
            tot--;
            ans-=x;
        }
        else 
        {
            if(dq.size())
            {
                dq.pop_front();
                ans-=x;
            }
        }

    }
    cout<<ans<<'\n';
}
int main ()
{
    #ifndef ONLINE_JUDGE 
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    #endif
    int T;
    cin>>T;
    while(T--) solve();
    return 0;
}

D

shi 一樣的數學題,還沒調出來。

相關文章