AtCoder-arc059 題解

来源:https://www.cnblogs.com/C-W-K/archive/2019/11/29/11960282.html
-Advertisement-
Play Games

A いっしょ / Be Together (結論/暴力) "題目鏈接" 題目大意: 有 $n$ 個數字,要將它們變成相等,對每一個數字最多操作一次,如將 $a \to b$ 的代價為 $(a b)^2$ ,求出最小的代價。 大致思路: 根據不等式的知識可以知道,假設最後數字變為 $x$,那麼 $x$ ...


A - いっしょ / Be Together (結論/暴力)

題目鏈接

題目大意:

\(n\) 個數字,要將它們變成相等,對每一個數字最多操作一次,如將 \(a \to b\) 的代價為 \((a-b)^2\) ,求出最小的代價。

大致思路:

根據不等式的知識可以知道,假設最後數字變為 \(x\),那麼 \(x\)\(\sum{a_i}\) 平均數的代價最小,由於要為整數,就取最接近 \(x\) 兩個整數做為結果,取其中最小的代價就行了。

代碼:

#include<bits/stdc++.h>
using namespace std;
int n;
int a[200];
int main()
{
    //freopen("H:\\c++1\\in.txt","r",stdin);
    //freopen("H:\\c++1\\out.txt","w",stdout);
    scanf("%d",&n);
    int ans1=0,ans2=0,sum=0;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        sum+=a[i];
    }
    int t1=sum/n,t2=(sum+n-1)/n;
    for(int i=1;i<=n;i++){
        ans1+=(t1-a[i])*(t1-a[i]);
        ans2+=(t2-a[i])*(t2-a[i]);
    }
    printf("%d\n",min(ans1,ans2));
    return 0;
}

B - アンバランス / Unbalanced (思維)

題目鏈接

題目大意:

給定一個字元串 \(s\) ,問其中是否存在“不平衡”的連續子串,“不平衡”的字元串被定義為長度大於等於 \(2\) ,且其中一個字母出現次數過半。有的話任意輸出一個。

大致思路:

一開始,想到要大於半數,那麼必須存在兩個相鄰的字母相同,交上去 \(wa\) 了,後來發現其實還有一種可能就是 \(3\) 個字母,頭尾相同,如 \(aba\) ,把兩種情況都枚舉一下,就行了。

代碼:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
char s[N];
int main()
{
    //freopen("H:\\c++1\\in.txt","r",stdin);
    //freopen("H:\\c++1\\out.txt","w",stdout);
    scanf("%s",s+1);
    int len=strlen(s+1);
    if(len==2&&s[1]==s[2]){ // 特判
        printf("1 2\n");
        return 0;
    }
    int l=-1,r=-1;
    for(int i=1;i<len-1;i++){
        if(s[i]==s[i+1]||s[i]==s[i+2]||s[i+1]==s[i+2]){
            l=i,r=i+2;
            break;
        }
    }
    printf("%d %d\n",l,r);
    return 0;
}

C - キャンディーとN人の子供 / Children and Candie (dp+計算貢獻)

題目鏈接

題目大意:

\(n\) 個人, \(C\) 個糖果,將 \(C\) 個糖果分配給 \(n\) 個人,每一個人有 \(c_i\) 個,可以為 \(0\) 個,每一個人有一個活躍度 \(x_i\) ,那麼這次分配的價值為 \(\prod{x_i^{c_i}}\) ,將一個值用 \(f(x_1,x_2,...,x_n)\) 表示,現在給你兩個數字 \(A[n],B[n]\) ,要求求出下式。

img

大致思路:

雖然這題過了,但是還是有很多細節的部分沒用弄懂,一開始根本沒有想到 \(dp\) 來解,後來看了題解才知道,當 \(A_i=B_i\) 的情形比較好想,設 \(dp[i] [j]\) 表示分給前i個人,使用 \(j\) 個糖果的價值數,那麼可以寫出方程,\(dp[i][j]+=dp[i-1][j-k]*(A_i^k)\)\(k\) 其實就是枚舉分給第 \(i\) 個人的糖果,但是當 \(A_i != B_i\) 的時候,我對於為什麼可以將求和號提出來有些疑惑,就是為什麼可以單獨計算某一個對總體的貢獻。具體的解法就是,將上述方程改成 \(dp[i] [j] += dp[i-1] [j-k] * (\sum_{t=A[i]}^{B[i]}{t^k})\),然後通過預處理就可以 \(O(n^3)\) 的過了。

(之後還得在思考思考)

代碼:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=500;
const int mod=1e9+7;
ll ksm(ll a,ll b){ // 快速冪
    ll res=1,t=a;
    while(b){
        if(b&1)res=(res*t)%mod;
        t=(t*t)%mod;
        b>>=1;
    }
    return res;
}
ll dp[N][N];
ll n,c;
ll a[N],b[N];
ll p[N][N];
ll sum[N][N];
void init(){ // 預處理
    for(int i=1;i<N;i++)
    for(int j=0;j<N;j++)p[i][j]=ksm(i,j);
    for(int k=0;k<N;k++){
        for(int i=1;i<N;i++)sum[i][k]=(sum[i-1][k]+p[i][k])%mod;
    }
}
int main()
{
    //freopen("H:\\c++1\\in.txt","r",stdin);
    //freopen("H:\\c++1\\out.txt","w",stdout);
    init();
    scanf("%lld%lld",&n,&c);
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    for(int i=1;i<=n;i++)scanf("%lld",&b[i]);
    dp[0][0]=1;
    for(int i=1;i<=n;i++)
    for(int j=0;j<=c;j++){
        for(int k=0;k<=j;k++){ //枚舉第i個人拿的糖果數
            dp[i][j]=(dp[i][j]+(dp[i-1][j-k]*(sum[b[i]][k]-sum[a[i]-1][k]+mod)%mod))%mod;
        }
    }
    printf("%lld\n",dp[n][c]);
    return 0;
}

D - バイナリハック / Unhappy Hacking (dp計數)

題目鏈接

題目大意:

\(3\) 個按鍵,分別是 \(,,0,1,backspace\) 鍵,按下 \(0\) 或者 \(1\) ,就會在最右邊出現 \(0\) 或者 \(1\) ,按下 \(backspace\) 鍵就會將最右邊的數字刪去,如果沒有數字就無事發生。現在告訴你一串數字,並且按了 \(n\) 次鍵,問有幾種按法。

大致思路:

這題一開始想分類討論,後來發現刪除的數字若是連在一起又可以改變刪除的順序就不會做了,看了題解,原來就是我一開始寫的 \(dp\) ,但是當時不懂怎麼轉移。用 \(dp[i][j]\) 表示按了 \(i\) 下,數字長度為 \(j\) 的方案數,我們考慮當前按下的是數字,那麼必然是和給定串的對應位相同,若按下的是刪除鍵,那麼就這位刪除的可以是 \(0\) 也可以是 \(1\) 就有兩種可能,按照這個轉移一下即可。

代碼:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=5010;
const int mod=1e9+7;
ll dp[N][N];
char s[N];
int n;
int main()
{
    //freopen("H:\\c++1\\in.txt","r",stdin);
    //freopen("H:\\c++1\\out.txt","w",stdout);
    dp[0][0]=1;
    scanf("%d",&n);
    scanf("%s",s+1);
    int len=strlen(s+1);
    for(int i=0;i<=n;i++)
    for(int j=0;j<=n;j++){
        if(j==0)dp[i+1][j]=(dp[i][j]+dp[i+1][j])%mod;//特判
        else{
            dp[i+1][j-1]=(dp[i][j]*2+dp[i+1][j-1])%mod;//按backspace
        }
        dp[i+1][j+1]=(dp[i+1][j+1]+dp[i][j])%mod;//按數字鍵
    }
    printf("%lld\n",dp[n][len]);
    return 0;
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2.1、anaconda的安裝 ​ 1 、安裝可執行程式 ​ 2 、配置環境變數 ​ 根據環境變數的 去查找可執行程式文件,如果查找到就執行,如果查找不到就報錯。 ​ 3 、python的多版本相容問題 ​ 修改可執行程式的文件名,再配置環境變數 ​ 4 、hash案例 2.2、requests模塊 ...
  • 生活中,當你閑暇之餘瀏覽資訊的時候,當你搜索資料但繁雜信息夾雜時候,你就會想,如何更為準確的定位需求信息。今天就為你帶來: 分頁查詢 需求分析:在列表頁面中,顯示指定條數的數據,通過翻頁按鈕完成首頁/上一頁/下一頁/尾頁的查詢 數據分析: 通過觀察,頁面上需要顯示下麵的幾個數據:當前頁:curren ...
  • 安裝 SQLAlchemy 報錯 安裝命令 報錯截圖 編碼錯誤,這裡我們需要改下源碼 解決方案 重新安裝,安裝成功 參數文章: ...
  • 在python3.7 環境下 函數聲明時能在參數後加冒號,如圖: 可能有疑問,python不是動態類型語言 ,難不成還能指定參數類型? 來看一下列印結果: 但同時也確實能傳其他類型的值 如:f("test",123) 那結果如何呢? 如下: 當然會報錯了啊,返回值是一個字元串,int型不能參與字元串 ...
  • student類 package cn.itheima.Manag;/** * *標準類 * **/public class Student { //學號 private String id; //姓名 private String name; //年齡 private String age; // ...
  • 伺服器的監控通過安裝一些常用的監控軟體之外,有時也需要運行一些shell或Python腳本;shell下可以使用系統自帶的ps/free/top/df等shell命令,Python可以調用subprocess等模塊來運行shell命令,不過這麼做就比較麻煩。這裡有一個比較好用的第三方模塊:psuti ...
  • 1.在一個文件夾名為www.html3.com的web項目來實現,首先到nginx的配置文件nginx.conf做如下配置 python和html混合編寫的文件,我以文件尾碼為.phtml,通過伺服器配置讓它重定向到 /rewrite/ 2.進去項目目錄下的static/html/ 編寫一個1.ph ...
  • 函數1 函數2 函數3 —————————————————————————————————————————————————————————————————— 1調用2,將變數a的地址做實參,傳給2的指針變數b。形如&a —》 *b。 2調用3,若仍以&b —》*c,則在指針變數c中,存入的是b的地址 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...