1. 程式人生 > >(未完結)“文遠知行杯”GDET第十四屆競賽(網絡賽共10題,僅整理出6題)

(未完結)“文遠知行杯”GDET第十四屆競賽(網絡賽共10題,僅整理出6題)

round 整理 一個 why fine std a* 計算器 反思

剛開學沒多久就打了一個網絡賽,通過這次網絡賽我是發現我是真的菜...

放假前校賽的排名讓我有些自滿,寒假絲毫沒有接觸ACM,一直沈迷於Steam,這個真的值得好好反省。

雖然現在大一課有點多,在學校也有些事務,但是這些都不是我松懈的理由,

在此寫下這篇博客就是為了提醒自己:Why(為什麽別人進科協,我要打 ACM ),How,What

這次比賽的反思:

  數論的學習實在是太過於薄弱,要加強,對數字的規律不夠敏感,要鍛煉,

  數據結構最常用的樹,不會,要學,

  這次題目總體不算特別難,題目的靈活度不大,關鍵自己會的知識太少。

題目鏈接

http://acm.hdu.edu.cn/search.php?field=problem&key=%A1%B0%D7%D6%BD%DA%CC%F8%B6%AF-%CE%C4%D4%B6%D6%AA%D0%D0%B1%AD%A1%B1%B9%E3%B6%AB%B9%A4%D2%B5%B4%F3%D1%A7%B5%DA%CA%AE%CB%C4%BD%EC%B3%CC%D0%F2%C9%E8%BC%C6%BE%BA%C8%FC&source=1&searchmode=source

HUD 6461(概率的問題)(答案4行1.00,//題目有點沒說明白)

HDU 6462(斐波那契數列平方和)

題意有點看不太清楚,但是所給的數據還是很容易發現規律,

斐波那契數列每一項的平方和,把所給的4進制a,b,換成10進制就行,打個表就OK了

#include <iostream>
#include <cstdio>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))

using namespace std;

const int
mod=192600817; const int maxn=4e4+5; long long fio[maxn]={0,1}; long long sum[maxn]={0,1}; void make_table() { for(int i=2; i<maxn; i++) { fio[i]=(fio[i-1]+fio[i-2])%mod; sum[i]=(fio[i]*fio[i])% mod+sum[i-1]; //後面是要求 sum的差值,這裏的sum不要求余,可大致看一下也能發現long long 不會溢出
} } int main() { make_table(); /* for(int i=0; i<10; i++) { printf("%d %I64d %I64d\n", i , fio[i], sum[i]); } */ int Q; while(cin>>Q) { while(Q--) { int a,b,c,d; cin>>a>>b>>c>>d; a=a*4+b+1; c=c*4+d+1; b=max(a,c); d=min(a,c); cout<<(sum[b]-sum[d-1])%mod<<endl; //取余別忘記了 } } return 0; }

HDU 6463(查詢第k個鴿子數)

一看就是肯定有規律,

方法1:

  隨便取幾個數字出來,打個表(我傻傻的那筆在那裏找規律,把電腦當計算器??)看一下,都會出現那些重復的數字,

  發現要麽會出現4要麽會出現1,然後打個表就OK了;

 1 #include <iostream>
 2 using namespace std;
 3 
 4 const int maxn=150005;
 5 long long table[maxn];
 6 
 7 bool myJudge(int n)
 8 {
 9     while(n!=1&&n!=4)
10     {
11         int sum=0;
12         while(n)
13         {
14             sum+=(n%10)*(n%10);
15             n/=10;
16         }
17         n=sum;
18     }
19     return n==1;
20 }
21 
22 void make_table()
23 {
24     int cnt=0;
25     for(int i=1; cnt<maxn; i++)
26     {
27         if(myJudge(i))
28             table[cnt++]=i;
29     }
30 }
31 
32 int main()
33 {
34     make_table();
35     int Q; cin>>Q;
36     while(Q--)
37     {
38         int k; cin>>k;
39         cout<<table[k-1]<<endl;
40     }
41 
42     return 0;
43 }

方法2:

  當時感覺有循環節,確定一個大概的循環次數,超出這個次數還未有1即false,不過當時很快就找出來規律,這個就沒寫了

方法3:

  記憶化搜索(配合set)

HDU 6464

  看了不少題解都說要用 帶權值的線段樹,或者主席樹,這個還不會,先放著,等學到這個在A了

HDU 6465(三角形的變換)

  找初始三角形邊的向量和變換後的邊的向量,在確定一下矩陣的類型,求矩陣。

  求出這個矩陣之後,對於每個給你的點,先求出它關於三角形第一個點變換之前的向量,乘上這個矩陣得到變換之後的向量,再加上三角形第一個點變換之後的坐標即可。

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 
 5 int main ()
 6 {
 7     int T; cin>>T;
 8     while(T--)
 9     {
10         double x[10],y[10];
11         for(int i=1;i<=6;i++)
12             cin>>x[i]>>y[i];
13             
14         for(int i=2;i<=3;i++)
15             x[i]-=x[1],y[i]-=y[1];
16         for(int i=5;i<=6;i++)
17             x[i]-=x[4],y[i]-=y[4];
18         
19         double a,b,c,d;
20         c=(x[5]*x[3]-x[6]*x[2])/(y[2]*x[3]-x[2]*y[3]);
21         a=(x[5]-y[2]*c)/x[2];
22         d=(y[5]*x[3]-y[6]*x[2])/(y[2]*x[3]-x[2]*y[3]);
23         b=(y[5]-y[2]*d)/x[2];
24         
25         int Q; cin>>Q;
26         while(Q--)
27         {
28             cin>>x[2]>>y[2];
29             x[2]-=x[1],y[2]-=y[1];
30             printf("%.2f %.2f\n",x[2]*a+y[2]*c+x[4],x[2]*b+y[2]*d+y[4]);
31         }
32     }
33     return 0;
34 }

HDU 6466

  超出的我的能力範圍...

HDU 6467

  上個課先,上完回來繼續寫

(未完結)“文遠知行杯”GDET第十四屆競賽(網絡賽共10題,僅整理出6題)