1. 程式人生 > >2016廣東工業大學新生杯決賽網路同步賽暨全國新生邀請賽 幾個寫出來了的題目

2016廣東工業大學新生杯決賽網路同步賽暨全國新生邀請賽 幾個寫出來了的題目

2016廣東工業大學新生杯決賽網路同步賽暨全國新生邀請賽
幾個寫出來了的題目
A.
`#include

#include<stdio.h>


int main(void)
{
    long long t,i,j,k,ans,w,s;
    long long n;
    scanf("%lld",&t);
    for (k=1;k<=t;k++)
    {
        scanf("%lld",&n);
        ans=0;
        while(n)
        {
            n/=2;
            ans+=n;
        }
        printf
("%lld\n",ans); } return 0; }

其實和A題一樣,但比賽時想了很久…
n!=1*2*3*…..*n,其中有2的因子的有2,4,6…..,數量為n/2。
取出這些數然後/2,便形成了新的序列1,2,3,4…..,即縮小了問題的規模。
所以只要重複操作即可。

C.

#include<stdio.h>
long long dp[10000];

int min(int a, int b)
{
    if (a>b) return b;
    else return a;
}

int main(void)
{
    int n, a, b, c, t, i, j, k, yu, ans;
    scanf("%d
"
, &t); for (k = 1;k <= t;k++) { scanf("%d %d %d %d", &n, &a, &b, &c); if (n % 4 == 0) { printf("%d\n", 0); continue; } dp[1] = a; dp[2] = min(2 * a, b); dp[3] = min(min(dp[2] + dp[1], dp[1] * 3
), c); yu = 4 - n % 4; ans = dp[yu]; for (i = 4;i <= 30;i++) { dp[i] = min(min(dp[i - 1] + a, dp[i - 2] + dp[2]), dp[i - 3] + dp[3]); if (dp[i]<ans && i % 4 == yu) ans = dp[i]; } printf("%d\n", ans); } return 0; }

動態規劃.dp[i]存放買i本書所需的最小花費。
所以狀態轉移方程dp[i]=min(dp[i-3]+dp[3],min(dp[i-1]+dp[1],dp[i-2]+dp[2]))
其中dp[1]=a(只有1種買法)
dp[2]=min(a*2,b)(買2個1本或1個2本)
dp[3]=min(c,min(a*3,dp[2]+a))(3個1本,1個1本+1個2本,1個3本)
需要購買的數量為(4-n%4)+4*k本(k為任意自然數)
我的想法:需要買的本數最多的情況是全買1次3本的直到夠分,所以dp算到15。
實際上,只有更少的情況:
對於餘數為1的情況:買1個1本 ,或者買1個2本+1個3本,或者買3個3本
(a,b,c大於0,不確定的只有這三個數之間的大小關係.其他情況都比這三種情況大)
對於餘數為2的情況:買1個2本,或者買2個1本,或者買2個3本
(對於買1個1本1個3本,必定在a+a和c+c之間,所以不予考慮)
對於餘數為3的情況:買1個3本,或者買3個1本,或者買1個2本1個1本。

另外:雖然n,a,b,c在1e9以內,但因為涉及到3*a,所以會超出int範圍
(我就是因為這個始終沒有想明白為什麼wrong answer….)

F.

#include<stdio.h>
#include<string.h>

int main(void)
{
    printf("ac");
    return 0;
}
水題

G.

#include<stdio.h>

int main(void)
{
    int n,k,i,j,z,x;
    while (scanf("%d %d",&n,&k)!=EOF)
    {
        z=1; x=1;
        for (i=n;i>=n-k+1;i--) z=z*i;
        for (i=k;i>=2;i--) x=x*i;
        if (x==0) z=1;
           else z=z/x;
        printf("%d\n",z);
    }
    return 0;
}

水題.求組合數

I.

#include<stdio.h>
struct zt
{
    int left;
    int right;
    int up;
    int down;
};

int ans;
int n, m;
struct zt tu[1010][1010] = { 0 };

void solve(int x, int y)
{
    if (ans == 1) return;
    if (x == n && y == m)
    {
        printf("Well done!\n");
        ans = 1;
    }
    if (tu[x][y].right == 1 && tu[x][y + 1].left == 1)
        solve(x, y + 1);
    if (tu[x][y].down == 1 && tu[x + 1][y].up == 1)
        solve(x + 1, y);
    return;
}



int main(void)
{
    int t, i, j, k, x, y;
    char v, b,l;
    scanf("%d", &t);
    for (i = 1;i <= t;i++)
    {
        scanf("%d %d", &n, &m);
        for (i = 1;i <= n;i++)
            for (j = 1;j <= m;j++)
            {
                tu[i][j].left = 0;
                tu[i][j].right = 0;
                tu[i][j].up = 0;
                tu[i][j].down = 0;
            }

        for (i = 1;i <= n;i++)
        {
            getchar();
            for (j = 1;j <= m;j++)
            {
                scanf("%c%d%c%d%c", &v, &x, &l, &y, &b);
                switch (x)
                {
                case 3:
                    switch (y)
                    {
                    case 0:
                        tu[i][j].left = 1;
                        tu[i][j].right = 1;
                        tu[i][j].down = 1;
                        break;
                    case 1:
                        tu[i][j].up = 1;
                        tu[i][j].left = 1;
                        tu[i][j].down = 1;
                        break;
                    case 2:
                        tu[i][j].up = 1;
                        tu[i][j].left = 1;
                        tu[i][j].right = 1;
                        break;
                    default:
                        tu[i][j].up = 1;
                        tu[i][j].right = 1;
                        tu[i][j].down = 1;
                        break;
                    }
                    break;
                case 4:
                    tu[i][j].up = 1;
                    tu[i][j].down = 1;
                    tu[i][j].right = 1;
                    tu[i][j].left = 1;
                    break;
                case 0:
                    break;
                default:
                    switch (y)
                    {
                    case 0:
                        tu[i][j].left = 1;
                        tu[i][j].right = 1;
                        break;
                    case 1:
                        tu[i][j].up = 1;
                        tu[i][j].down = 1;
                        break;
                    case 2:
                        tu[i][j].left = 1;
                        tu[i][j].down = 1;
                        break;
                    case 3:
                        tu[i][j].up = 1;
                        tu[i][j].right = 1;
                        break;
                    case 4:
                        tu[i][j].up = 1;
                        tu[i][j].left = 1;
                        break;
                    case 5:
                        tu[i][j].down = 1;
                        tu[i][j].right = 1;
                        break;
                    }
                    break;
                }
            }
        }
        ans = 0;
        solve(1, 1);
        if (ans == 0)
            printf("What a pity!\n");
    }
    return 0;
}

深度優先搜尋,若向右或下走得通(該點的右邊(下邊)有路,且目標點的左邊(上邊)有路),那麼就去嘗試.找到一條路徑後退出。

J.

#include<stdio.h>
#include<math.h>
int main(void)
{
    int t,n,i,j,k,find,x,left,right;
    scanf("%d",&t);
    for (k=1;k<=t;k++)
    {
        scanf("%d",&n);
        find=1; x=n;
        while (find)
        {
            int m=sqrt(x);
            if (sqrt(x)*sqrt(x)==x)
            {

                for (i=2;i<=sqrt(m);i++)
                {
                    if (m%i==0) break;
                }

            if (i>sqrt(m)) {find=0; right=x;}
            }
            if (find==1) x++;
        }
        find=1;
        x=n-1;
        while (find && x>1)
        {
            int m=sqrt(x);
            if (sqrt(x)*sqrt(x)==x)
            {

                for (i=2;i<=sqrt(m);i++)
                {
                    if (m%i==0) break;
                }

            if (i>sqrt(m)) {find=0; left=x;}
            }
            if (find==1) x--;
        }
        if (find==1) printf("%d\n",right);
        else if (right-n<n-left) printf("%d\n",right);
        else printf("%d\n",left);

    }
    return 0;
}

分別向後搜尋、向前搜尋,先判斷是否為平方數,再取平方根進行素數判斷,最後取距離小的。

總之,作為一個新生,還是有很多需要改進的地方。程式只作參考,不一定是簡單的思路。

相關推薦

2016廣東工業大學新生決賽網路同步全國新生邀請賽總結

比賽連結:點這裡 題目: Problem A: pigofzhou的巧克力棒 Description 眾所周知,pigofzhou有許多妹子。有一天,pigofzhou得到了一根巧克力棒,他想把這根巧克力棒分給他的妹子們。具體地,這根巧克力棒長為 n,他想將

2016廣東工業大學新生決賽網路同步全國新生邀請賽 出來題目

2016廣東工業大學新生杯決賽網路同步賽暨全國新生邀請賽 幾個寫出來了的題目 A. `#include #include<stdio.h> int main(void) { long long t,i,j,k,ans,w,s;

2016廣東工業大學新生決賽解題報告

a.pigofzhou的巧克力棒 舉一些例子,可以得出把長度為n的棒劃分最多高興值的方法是:設最大的不超過n的2的整數冪是k,則分為2^k和n-2^k兩份。 2^k則是每次分為兩半,而剩下的再遞迴以同樣的方法劃分。 f(n)=f(2^k)+f(n-2^k),f(2^k)=2*f(2^(k

2016廣東工業大學新生決賽:Problem I: 只會做水題的jiakin

聽說ACM新生杯來了許多大佬,嚇得只會做水題的jiakin開始做水題。 題目在一個n行m列二維網格中,位於右下角的格子。現在有若干種水管,型別及狀態如下: 在網格中有一些格子布置著水管(只有一種型別一種狀態),現在jiakin從最左上的格子開始灌水(即最左上的格子一直有水),且水只能沿水管向右或

2016廣東工業大學新生決賽:Problem G: 神偷TMK後續

Problem G: 神偷TMK後續 Description TMK十分喜歡打CS,據說GDUTACM新生杯的一等獎的獎品的星際CS的真人CS遊戲團體券,他毅然報了名。 然而TMK等不及決賽的來臨,希望能早日可以玩真人CS。於是TMK打算把真人CS遊戲團體券從師

2016廣東工業大學新生決賽:Problem B: Zhazhahe究竟有多二

程式碼: #include<iostream> #include<algorithm> #include<cstring> #include<cctype> #include<cstdio> #include<set> #include

2017廣東工業大學程式設計競賽決賽 Problem G: 等凹數字(迴文+數位dp)

Problem G: 等凹數字 Description 定義一種數字稱為等凹數字,即從高位到地位,每一位的數字先非遞增再非遞減,不能全部數字一樣,且該數是一個迴文數,即從左讀到右與從右讀到左是一樣的,僅形成一個等凹峰,如543212345,554433445

湖南大學ACM程序設計新生大賽(同步)A - Array

ons arr algo mes 暴力 spa one -m non-zero 題目描述 Given an array A with length n a[1],a[2],...,a[n] where a[i] (1<=i<=n) is positi

湖南大學ACM程序設計新生大賽(同步)D - Number

nbsp 技術分享 namespace file algorithm man out ima http 題目描述 We define Shuaishuai-Number as a number which is the sum of a prime square(

湖南大學ACM程序設計新生大賽(同步)B - Build

res continue lld -h pair () edge ted lines 題目描述 In country A, some roads are to be built to connect the cities。However, due to l

湖南大學ACM程序設計新生大賽(同步)I - Piglet treasure hunt Series 1

-i tell left subject void app upper ear mat 題目描述 Once there was a pig, which was very fond of treasure hunting. The treasure hunt is

湖南大學ACM程序設計新生大賽(同步)J - Piglet treasure hunt Series 2

題解 package sig test space tle spa pri walk 題目描述 Once there was a pig, which was very fond of treasure hunting. One day, when it woke

湖南大學ACM程式設計新生大賽(同步)A-Array 【證明+暴力】

時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 131072K,其他語言262144K 64bit IO Format: %lld 題目描述 Given an array A with length n a[1],a[2],…,a[n]

第十二屆北航程式設計競賽決賽網路同步: 浪哥的煩惱

題目連結:https://biancheng.love/problem/587/index 題目描述 最近學校大檢查,要求上課認真聽講,這讓浪哥很是煩惱,因為這樣他就不能上課刷題了。但經過不懈的觀察,他發現領導檢查是有一定的規律的。不妨把每層樓的教室看成一排,從 1

首屆湖北省大學程式設計競賽(網路同步

時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 262144K,其他語言524288K 64bit IO Format: %lld 題目描述 Mingming, a cute girl of ACM/ICPC team of Wuhan Univers

廣東工業大學2018新生決賽

  題出的好!難度適中,覆蓋知識點廣,題目又著切合實際的背景,解法比較自然。給出題人點贊 !   然而我太菜了,只會8/13,差不多一半不會   A: 文遠知行β 題目加粗,n個時刻速度均大於0. #include<cstdi

廣東工業大學2017新生決賽)-網路同步

題目連結 做著做著快餓昏了! 格式卡的很嚴,輸入的最後一個數後面不能有空格; 最後一組樣例的答案還必須要有換行!!!!!! 1001 junior97與The Flash 找出正n邊形的外接圓,求出半徑,每次對相鄰的兩個點藉助半徑求距離。 #i

2017廣東工業大學ACM新生決賽

野生題解。 Problem A: junior97與The Flash 思路:這題精度有點苛刻了,導致姿勢不太好的小夥伴都過不了。我的做法是先求出中心到頂點的距離(即外接圓半徑,因為ax和角xoa已知),那麼求距離直接用餘弦定理就OK。 # include <

廣東工業大學新生決賽2017解題報告

A: junior97與The Flash 數學幾何題,對我這數學渣渣十分不友好。看的大佬的blog。問題的突破點在於,找到正n邊形的中心點到某一頂點的距離,根據這個距離,和中心與兩頂點所成交的弧度,就可以根據餘弦定理算出對角線長度。下面是中點到頂點的距離的求法,根據邊長為1和相鄰兩點與中點連線

2018年廣東工業大學文遠知行新生程式設計競賽 1013 在那天的雪停息之前β

Problem Description In the world line 1.048596% 麻衣的鮮血逐漸將潔白而冰冷的絨毯染成鮮紅...... 鮮紅...... 究竟是多少次看到這樣的情境呢?梓川咲太的心已經麻木了。 為了挽救在12月24四日為了梓川咲太而獻身的櫻島麻衣。在牧之原翔子的