GYM 100488 Toy Soldiers

題目鏈接

題意

一排娃娃,每一個都有自己本來的顏色。重新塗色m次,問最少要重新塗色多少次能讓所有娃娃的顏色一致。
如果不需要重新塗色輸出0,經過m次塗色後仍不能同色輸出-1;

解決

  1. 一開始因爲每次塗色後都進行了judge(),所以被超時
  2. 之後更改了judge()函數,嘗試了從兩端開始檢測是否相等,同時判斷兩端和中間是否相等。然而還是被超時
  3. 最後想到了本題核心沒有必要每一次重新塗色後就進行judge()如果judge失敗,記錄本次塗色的玩偶的編號和顏色,等到下一次出現改編號或者該顏色的時候再進行judge,這樣2s超時的程序被優化到100ms左右
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <complex>
using namespace std;
typedef long long ll;
typedef long double db;
typedef pair<int,int> pii;
typedef vector<int> vi;
#define de(x) cout << #x << "=" << x << endl
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define E 1e-6
#define INF 0x3f3f3f3f
void open(){freopen("data.txt","r",stdin);}
void out(){freopen("out.txt","w",stdout);}
const int N = 101010;
const int MOD = 1e9 + 7;

int num[100005];
int n;
bool judge()
{
    int l=1,r=n;
    while(l<r)
    {
        int mid=(l+r)/2;
        if(num[mid]!=num[l]||num[mid]!=num[r]||num[l]!=num[r]) return false;
        l++;
        r--;
    }
    return true;
}
int main()
{
    //open();
    int m,a,b;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)   scanf("%d",&num[i]);
    if(judge())
    {
        printf("0\n");
        return 0;
    }
    scanf("%d",&m);
    int pre_a,pre_b;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&a,&b);
        num[a]=b;
        if(a==pre_a||b==pre_b||i==1)
        {
            if(judge())
            {
                printf("%d\n",i);
                return 0;
            }
        }
        pre_a=a;pre_b=b;
    }
    printf("-1\n");
    return 0;
}
發佈了54 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章