1. 程式人生 > >Codeforces Round #546 div.2 B,C

Codeforces Round #546 div.2 B,C

重復元素 原來 分析 end 一個 class namespace lse 結果

第一次熬夜打cf,感覺確實腦子不靈光了. 再加上邊界條件確實考慮不周全.
寫下我的wa題思路吧

B

  • 題意: 一排洞,每個洞下面有一個金幣,上面有一個石頭,需要將所有的金幣取出,且只有將石頭移開才能取金幣
    移動,移動石頭,取金幣都花費1
  • 思路: 根據暴力加模擬的思想,分析樣例可知在經歷過前兩個洞之後,每個洞只需要走,移,取 三步.
    前兩個洞需要有一個洞空出來,來供後面的洞來放石頭,一側的石頭處理完後便移動到開頭來處理另一側.

#include<bits/stdc++.h> 

#define ll long long 

#define inf 0x3f3f3f3f
using namespace std; 

const int maxn = 1e5+10;

int n,k;
int main(){
    cin >> n >> k;
    if(k==n || k==1)
        cout << (n-2)*3+6 << endl;
    else
//      cout << (n-2)*3+6+k-1 << endl;
    {
//      int ans = 6;
//      for(int i=k-1;i>1;--i)  ans+=3;
//      ans += k-1;
//      for(int i=k+1;i<=n;++i) ans+=3;
//      cout << ans << endl;
//      k = min(n-k,k);
        int ans = (n-2)*3+6-1;
        if(k>n/2){
            ans += (n-k)+1;
        }else{
            ans += k;
        }
        cout << ans << endl;
    }
//  if(n-k==1 || k==1)
//  {
//  cout << (n-2)*3+6 << endl;
//  }
//  else if(n==2)
//          cout <<6 << endl;
//      else
//          cout << (n-2)*3+7 << endl;
    return 0;
}

註釋掉的代碼,是我走過的心路旅程

首先\(k=n\)\(k=1\)是等價的 都不需要再從一側移動回來
當k>n/2,我們移動的距離是\((n-k)+1\)的半段
總體來說還是很簡單的

C

  • 題意: 給一個矩陣,可以進行任意大小任意次數的轉置,
    問是否能變化成另一個矩陣
  • 思路: 副對角線是聯通的,只需判斷每個聯通集是否完全相對
#include<cstdio>
#include<deque>
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<stack>
#include<map>
#define ll long long 

#define inf 0x3f3f3f3f
using namespace std; 
int n,m;
const int maxn = 510;

int a[maxn][maxn];
int b[maxn][maxn];

vector<int> aa;
vector<int> bb;
map<int,int> ma;
map<int,int> mb;
int vis[maxn*maxn];
int main(){
    cin >> n >> m;
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j)   scanf("%d",&a[i][j]);
    }
    for(int i=1;i<=n;++i){
        for(int j=1;j<=m;++j)   scanf("%d",&b[i][j]);
    }
    for(int i=2;i<=m+n+1;++i){
        ma.clear();
        mb.clear();
        for(int j=1;j<i;++j){
            int k = i-j;
            if(j>n || k>m)  continue;
            ma[a[j][k]]++;
            mb[b[j][k]]++;
        }
        for(auto j:ma){
            if(mb[j.first]!=j.second){
                cout << "NO" << endl;
                return 0;
            }
        }
    }
    cout << "YES" << endl;
    return 0;
}

這題錯的更慘
最後兩分鐘交了一發ac了,結果賽後重判又給wa了,原因是原來map的計數有問題,不能解決聯通集有重復元素的情況.
而且一開始輸入用的cin老是TLE QAQ

收獲:

  1. 數據大,讀入優化(這道題輸入是1e6的)
  2. map判斷集合相等,只需要把每個值加入到map中,然後判斷second(出現次數)是否相等.

其實這兩題都非常的簡單,wa題的關鍵在於細節沒有控制好吧

Codeforces Round #546 div.2 B,C