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四日為了梓川咲太而獻身的櫻島麻衣。在牧之原翔子的