【反思】2019年廣東工業大學騰訊杯新生程序設計競賽(同步賽)

昨天下午在牛客上籤了三場比賽的到,然後晚上又發現還有一場廣東工業大學的同步賽,本來打算籤chougejiang就溜的,然後看到了幾題都挺好的,就試着做了一下。
(然後就有了反思= .=)

這次比賽最大的收穫就是明白了:
在稿紙上演算的重要性!

首先上題目

1.危險的臺階

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld
在這裏插入圖片描述

聖盃,雖然表面上被稱作萬能願望機,但已經失去了原本的光華。污穢不堪的黑泥已經染指了聖盃,還是說,這些黑泥出自聖盃本身呢。這些並不應該在面對一個暴亂的聖盃的時候去思考。
「格蕾」
「是,亞德!」格蕾從右手處拉出裝着亞德的鳥籠
「直接進入解除封印階段吧」
「欸」格蕾對我的指令似乎有所遲疑,但還是相信我的決定「我明白了,但是周圍的魔力被不斷的攝取固化了」
「用這個」我拿出之前獲得的鑰匙,那是王之鍵,是王之寶庫的鑰匙。雖然正常情況下沒有辦法使用,但是現在的情況已經足夠不正常了。
要打開王之寶庫除了英雄王本人,還有一種辦法就是對王之鍵進行魔力供給。雖然實際情況很複雜,但是我還是想到了一個很簡單的物理模型。就好像在懸崖上有n塊長度均爲L,重量均爲m而且質量分佈均勻的石板。要把石板用臺階式的堆疊方式,延伸出去。在任何一塊石板都不會掉落懸崖的情況下,儘可能的使石板的最右端遠離懸崖邊緣。此時石板最右端和懸崖邊緣的距離就是我需要進行魔力供給的量。

輸入描述:

第一行輸入三個正整數,包括石板個數n(1<=n<=1e5),石板長度L(1<=L<=1e9),石板質量m(1<=m<=1e9)

輸出描述:

輸出最右那一塊石板的最右端距離懸崖邊緣的最大距離(保留四位小數)

示例輸入
1 1 1
示例輸出
0.5000
解題關鍵詞:重心。顯然石板最大的伸出長度時的情況即 所有石板構成的形體 的重心落在懸崖邊上時的情況。
解題思路:我首先想的是從最高(外)處那塊石板開始考慮,假設每塊石板的長度爲1。當只有一塊石階時,顯然,由於石板密度均勻,一塊長度爲1的石板的重心即爲1/2,因此,最大伸出長度爲1/2。然後,考慮兩塊石板時的情況,如下圖。只需找到兩塊石板的重心即可,顯然可得,最大長度爲1/2+1/4=3/4。到這裏的思考顯然沒問題,但是比賽時我看到這裏,心裏已經默認結果爲(1/2)L+(1/4)L+(1/8)L+…+(1/2*n)L了,當然,WA了。然後後來由於打(籤)了三場比賽還有白天沒午睡太累了,就趴着睡覺了,後來經hg的提醒和演算,才發現結果應是 (1/2)L+(1/4)L+(1/6)L+…+(1/2n)L(可根據重心聯立方程組解得第三塊石板伸出長度爲1/6),當然學長肯定應該也不是單純靠腦袋想出來的,想必也是經過演算得到規律。

在這裏插入圖片描述
貼上AC代碼

#include <cstdio>
#include <math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main ()
{
    double n,l,m,sum=0;
    scanf("%lf %lf %lf",&n,&l,&m);
    int j=2;
    for(int i=0; i<n; i++)
    {
        sum+=l/j;  j+=2;
    }
    printf("%.4lf",sum);
    return 0;
}

-------------------------------------分割線-----------------------------------------------

1.消亡的質數

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld

題目描述

「你來了啊,埃爾梅羅二世」這一切事件的元兇正站在那聖盃之下「這一切都要結束了」
「嗚」我的想法被現實無情的敲碎了,從見到那位從者的那一刻我就該意識到聖盃也許是殘缺的,但是依然是聖盃。從一開始就沒有辦法阻止這個儀式,這七騎從者中早已有六騎隕落。這場虛僞的戰爭早已寫下了勝者的名字。之前的影從者也只是幌子罷了,只是希望的殘影。和我締結了契約的理查一世也如同燃燒後的灰燼一般消失了。
「那麼,你就要到達根源了嗎」
「那是不可能的」他的臉上沒有任何表情,只是完全的冷漠「你還帶着四騎士之信吧,最終的答案就寫在信上」
「why dun it」
「到了如今這個地步,做這件事的原因你已然瞭解於心中,爲何還要一介亡人來回答呢。我已經放棄了,而你還沒有吧,太可悲了」
我還想更進一步的詢問,但他已經消失了。我打開隨身攜帶的那封信,上面寫着許多數字,都是質數。其中有的質數可能等於某兩個正整數的立方差。判斷出所給的每個質數是否與某兩個正整數的立方差相等,我終於發現了最終他要說的是什麼了。

輸入描述:

第一行輸入一個整數T (1<=T<=100),代表有T個樣例。
對於每組樣例,輸入一行,每行輸入一個質數p (2<=p<=1e15)

輸出描述:

對於每一組樣例,若p與某兩個正整數的立方差相等,輸出"YES",否則輸出"NO"(不包括雙引號)

樣例輸入:
5 
2 
3 
5 
7 
11
樣例輸出:
NO 
NO 
NO 
YES 
NO
解題思路:這道題顯然暴力會TLE,但是我思考了很久,確實想不到優化暴力的思路。後來查看題解時發現,原來這是一道高中or初中數學題。。(數學於算法的重要性毫無疑問)。先上題解:

在這裏插入圖片描述

根據質數的性質:只能被1和它本身整除,又有x³-y³=p化簡得(x−y)*(x²+xy+y²)=p,可見p有因子x−y和x²+xy+y²顯然後者在該題背景下不可能爲1,因此,所有質數p只能被兩個相鄰的整數表示爲x³-y³=p

貼上AC代碼:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ll p;
        bool flag = 0;
        cin>>p;
        for(ll i = 1; ; i++)
        {
            ll a = i*i*i;
            ll b = (i+1)*(i+1)*(i+1);
            if(b - a == p)
            {
                flag = 1;
                break;
            }
            if(b - a > p)
            {
                break;
            }
        }
        cout<<((flag)?"YES\n":"NO\n");
    }
    return 0;
}
發佈了55 篇原創文章 · 獲贊 54 · 訪問量 7418
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章