1. 程式人生 > >2018年全國多校演算法寒假訓練營練習比賽(第三場)題解

2018年全國多校演算法寒假訓練營練習比賽(第三場)題解

題目連線

 由於在比賽期間發現了很多是原題,所以直接抄了原題程式碼,稍後準備重寫。

A - 不凡的夫夫

答案為$\left\lfloor {\sum\limits_{i = 1}^n {{{\log }_8}i} } \right\rfloor  + 1$,由於資料範圍的問題,可以將詢問離線,然後$1$到$10^7$跑一遍答案都在了

聽說有$O(1)$公式,表示並不會推...

#include <bits/stdc++.h>
using namespace std;

int ans[1000010];
struct Q {
  int n;
  int id;
  int ans;
}s[1000010];

double work(int x) {
  return log10(1.0 * x) / log10(8.0);
}

bool cmp(Q & a, Q & b) {
  return a.n < b.n;
}

int main() {
  int n;
  int T;
  cin >> T;
  for(int cas = 1; cas <= T; cas ++) {
    scanf("%d", &s[cas].n);
    s[cas].id = cas;
  }
  sort(s + 1, s + 1 + T, cmp);
  int now = 0;
  double A = 0.0;
  for(int i = 1; i <= T; i ++) {
    while(now < s[i].n) {
      now ++;
      A += work(now);
    }
    ans[s[i].id] = (int)A + 1;
  }
  for(int i = 1; i <= T; i ++) {
    printf("%d\n", ans[i]);
  }
  return 0;
}

B - 一個小問題

該題存在一些問題。如果$a$全是素數,$r$全是$0$,由於要求$x$是正整數,那麼答案是所有不同素數的乘積,答案會很大。

C - 守護白起

這題和POJ 2409一樣,只是資料範圍擴大了一下,注意取模。

程式碼稍後。

D - 小牛vs小客

只有$1$和$2$小牛會贏,其餘都是小客贏。

#include <bits/stdc++.h>
using namespace std;

int main() {
  int n;
  while(cin >> n) {
    if(n > 2) printf("XiaoKe\n");
    else printf("XiaoNiu\n");
  }
  return 0;
}

E - 進擊吧!階乘

大數運算,直接上了Java。

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;

public class Main {
	static Scanner cin = new Scanner(System.in);
	
	public static void main(String[] args) {
		while(cin.hasNext()) {
			int n = cin.nextInt();
			BigInteger ans = BigInteger.ONE;
			for(int i = 1; i <= n; i ++) {
				ans = ans.multiply(BigInteger.valueOf(i));
			}
			System.out.println(ans);
		}
	}
}

F - 小牛再戰

這題我是看樣例猜的,除去1的數字全部異或起來,看是否為$0$。原因還要深入研究一下。

#include <bits/stdc++.h>
using namespace std;

int a[1000];
int n;

int main() {
  while(~scanf("%d", &n)) {
    if(n == 0) break;
    int ok = 0;
    for(int i = 1; i <= n; i ++) {
      scanf("%d", &a[i]);
      if(a[i] != 1) ok ^= a[i];
    }
    if(ok) printf("Win\n");
    else printf("Lose\n");
    
  }
  return 0;
}

G - 大水題

$狀壓dp$。

$dp[i]$表示 被$i$狀態的數字整除的數字有幾個,倒著減下來能算出能 只能 被被狀態$i$整除的數字有幾個,$dp[0]$就是答案。看一下程式碼就能明白了。

#include <bits/stdc++.h>
using namespace std;

long long x[10];
long long st[1000];
long long dp[1000];

void init() {
  x[0] = 2;
  x[1] = 5;
  x[2] = 11;
  x[3] = 13;
  for(int j = 0; j < (1 << 4); j ++) {
    st[j] = 1;
    for(int p = 0; p < 4; p ++) {
      if(j & (1 <<p)) st[j] *= x[p];
    }
   // cout << j << " " << st[j] << endl;
  }
}

int main() {
  init();
  long long n;
  while(~scanf("%lld", &n)) {
    long long ans = 0;
    for(int i = 0; i <= 20; i ++) {
      dp[i] = 0;
    }
    for(int i = 0; i < 16; i ++) {
      dp[i] = n / st[i];
    }
    for(int i = 15; i >= 0; i --) {
      for(int j = i + 1; j <= 15; j ++) {
        if((i | j) == j) {
          dp[i] -= dp[j];
        }
      }
    }
    printf("%lld\n", dp[0]);
  }
  return 0;
}

H - 向左走

這題和POJ 1696一樣,每次極角度排序找第一個即可。

程式碼稍後。

I - 三角形

皮克定理,這題和HDU 1705一樣。

#include <bits/stdc++.h>
using namespace std;

struct point {
  long long x, y;
}p[5];

long long gcd(long long a, long long b) {
  if(b == 0) return a;
  return gcd(b, a % b);
}

long long work(point &a, point &b) {
  long long len1 = abs(a.x - b.x);
  long long len2 = abs(a.y - b.y);
  return gcd(len1, len2) - 1;
}

long long area(point &a, point &b, point &c) {
  return abs(a.x * b.y + b.x * c.y + c.x * a.y - a.x * c.y - b.x * a.y - c.x * b.y);
  //(x1y2+x2y3+x3y1-x1y3-x2y1-x3y2)
}

int main() {
  while(~scanf("%lld", &p[0].x)) {
    if(p[0].x == -1) break;
    scanf("%lld", &p[0].y);
    scanf("%lld%lld", &p[1].x, &p[1].y);
    scanf("%lld%lld", &p[2].x, &p[2].y);
    long long A = work(p[0], p[1]);
    long long B = work(p[1], p[2]);
    long long C = work(p[2], p[0]);
    long long s = area(p[0], p[1], p[2]);
    long long edge = A + B + C + 3;
    long long nei = (s - edge + 2) / 2;
    printf("%.1f %lld %lld %lld %lld\n", 1.0 * s / 2.0, nei, A, B, C);
  }
  return 0;
}

相關推薦

2018全國演算法寒假訓練營練習比賽題解

【題目連線】  由於在比賽期間發現了很多是原題,所以直接抄了原題程式碼,稍後準備重寫。 A - 不凡的夫夫 答案為$\left\lfloor {\sum\limits_{i = 1}^n {{{\log }_8}i} } \right\rfloor  + 1$,由於資料範圍的問題,可以將詢問離線

2018全國演算法寒假訓練營練習比賽

A不凡的夫夫 題目描述  夫夫有一天對一個數有多少位數感興趣,但是他又不想跟凡夫俗子一樣, 所以他想知道給一個整數n,求n!的在8進位制下的位數是多少位。 輸入描述: 第一行是一個整數t(0<t<=1000000)(表示t組資料)接下來t行,每一行有一個

2018全國演算法寒假訓練營練習比賽題解

【題目連結】 A - 石油採集 題意:有一個$01$矩陣,每次可以拿走兩個相鄰的$1$,問最多能操作幾次。 這題和HDU 1507一樣。二維矩陣四連通圖是一個二分圖,題目的操作事實上就是求這個二分圖的最大匹配。 B - 道路建設 最小生成樹 #include <bits/st

2018全國演算法寒假訓練營練習比賽題解

#include <bits/stdc++.h> using namespace std; const int maxn = 110000; int n; int A, B; int a[maxn]; map<int, int> belong; map<i

牛客網 2018全國演算法寒假訓練營練習比賽 題解

A-石油採集 題目描述 隨著海上運輸石油洩漏的問題,一個新的有利可圖的行業正在誕生,那就是撇油行業。如今,在墨西哥灣漂浮的大量石油,吸引了許多商人的目光。這些商人們有一種特殊的飛機,可以一瓢略過整

2018全國演算法寒假訓練營練習比賽 E-通知小弟

連結:https://www.nowcoder.com/acm/contest/76/E 來源:牛客網 題目描述         在戰爭時期,A國派出了許多間諜到其他國家去收集情報。因為間諜需要隱祕自己的身份,所以他們之間只是單向聯絡。

2018全國演算法寒假訓練營練習比賽D集合問題詳解

題目描述 給你a,b和n個數p[i],問你如何分配這n個數給A,B集合,並且滿足: 若x在集合A中,則a-x必須也在集合A中。若x在集合B中,則b-x必須也在集合B中。輸入描述:第一行 三個數 n a b  1<=n<=1e5  1<=a,b<=1e9

2018全國演算法寒假訓練營練習比賽第一 Problem:H

問題H:方塊與收納盒                  時間限制:1 Sec 記憶體限制: 32768K Problem Des

2018全國演算法寒假訓練營練習比賽第二D爐石

題目連結如下 https://www.nowcoder.com/acm/contest/74/D emmm題是最長不下降子序列 跟最長上升子序列的區別不僅僅是在一個等號QAQ是兩個等號 被自己蠢哭了 for(int i=1;i<=n;i++) {

2018全國演算法寒假訓練營練習比賽第一

這是一場拼手速和細節的比賽,難題並不多,我做的七道題裡沒有一道涉及演算法。我雖然做的有點慢,但是七道題全部1A,其中J題的規律想半天想不出來,感謝Winzard大神出手相助告訴了我hhhhh,最後拿了第26名,還算可以吧。 首先把n把槍的屬性全部記錄下來,然後對m個配件

牛客——2018全國演算法寒假訓練營練習比賽第一

這場還是新生賽,主要是模擬,搜尋,遞推遞迴,思維題。模擬手速還是慢,也會考慮不周全。 G:搜尋: 連結:https://www.nowcoder.com/acm/contest/67/G 來源:牛客網 題目描述     圈圈圓圓圈圈,lulu小朋友最近看喜羊羊看多了,

2018牛客演算法寒假訓練營練習比賽C-字串的問題KMP or find

題目連結:https://ac.nowcoder.com/acm/contest/77/C 思路:根據next 陣列各值的含義:代表當前字元之前的字串中,有多大長度的相同字首字尾。例如如果next [j] = k,代表j 之前的字串中有最大長度為k 的相同字首字尾。我們用num陣列

2018全國算法寒假訓練營練習比賽題解

排序 esp 註意 test sca big %d question long long 【題目連接】 由於在比賽期間發現了很多是原題,所以直接抄了原題代碼,稍後準備重寫。 A - 不凡的夫夫 答案為$\left\lfloor {\sum\limits_

2018全國算法寒假訓練營練習比賽

upload 線段 fall 警鐘 預處理 數學 tex sqrt -- 之前題目比較水,今天的還可以。 【A 不凡的大夫】 方法一:答案是log8(n!),解決方案是預處理,將需要的答案記錄下來以免超內存; 方法二:用公式,斯特林公式: 【B 一個小問

斯特林公式-Stirling公式取N階乘近似值-HDU1018-Big Number 牛客網NowCoder 2018全國算法寒假訓練營練習比賽A.不凡的夫夫

subject color content coder -m ria 一點 練習 java 最近一堆題目要補,一直鹹魚,補了一堆水題都沒必要寫題解。備忘一下這個公式。 Stirling公式的意義在於:當n足夠大時,n!計算起來十分困難,雖然有很多關於n!的等式,但並不能很

2018全國算法寒假訓練營練習比賽題解

ret ref amp 排列 break call eof while push_back 【題目鏈接】 A - 石油采集 題意:有一個$01$矩陣,每次可以拿走兩個相鄰的$1$,問最多能操作幾次。 這題和HDU 1507一樣。二維矩陣四連通圖是一個二分圖

2018全國算法寒假訓練營練習比賽題解

樹狀數組 訓練營 lan 排序 for string ios 字符 fail 【題目鏈接】 A - 逆序數 經典問題,有很多方法,例如樹狀數組,線段樹,歸並排序等。代碼不貼了。 B - Big Water Problem 單點修改求區間和,樹狀數組

牛客網NowCoder 2018全國算法寒假訓練營練習比賽A.石油采集(dfs) B.道路建設(最小生成樹prim) C.求交集(暴力) F.Call to your teacher(迪傑斯特拉亂用) H.老子的全排列呢(dfs)

初始 -o 地圖 意義 技術 tle bject ios urn 菜哭了。。。 A.石油采集 時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 32768K,其他語言65536K 64bit IO Format: %lld 鏈

牛客網 2018全國算法寒假訓練營練習比賽

ios ext ++i onclick 比賽 dag 練習 empty 分享圖片 T1 石油采集 這題可以建一張二分圖跑最大匹配,也可以直接染色然後數數 #include<bits/stdc++.h> using namespace std;

2018全國算法寒假訓練營練習比賽:A題:逆序數

quest pre log color 示例 IT pac 輸出 div 題目描述 在一個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麽它們就稱為一個逆序。一個排列中逆序的總數就稱為這個排列的逆序數。比如一個序列為4 5 1 3 2, 那麽這個序