記一次unhappy考試(10.5)
orz orz AK爺 紅名爺
論如何爆成120。。。。。
首先是如何B題拿20分
驚訝地發現只有20分
一番魔改之後
讓我們看看發生了什麼吧!!!
MDZZ,輸出個毛線標記啊!
然後我們還是發現,有一個點T掉了????
交了一發網上搜到的程式碼,A掉了!!!
可我一交,第二個點還是T了。。。。
拷來了第二個點的資料,我忍不住再說一句:MDZZ
第七個人的父母呢??被吃了??讓我一個開了讀入優化的情何以堪!!刪了讀入優化就瞬間A掉了。
(論如何爆掉70分)
第三題。。。。
再給我10分鐘!!!!
16:00考試結束,再爆85分。
那麼問題來了,還有15分哪去了??
我又拷來了資料
嗯,四個很大的一樣大的矩形。
看看程式碼,
這不是搞笑嗎?,4個49*50的矩形面積會小於5000。。。。
3s時間一改,A了。(假裝只掉了85分好了)
/**********************************
(Azure)我是華麗的分割線(Azure)
**********************************/
題解時間
T1題解
簡直就是在搞笑,3分鐘就推出公式了,總共3種情況,
面對角線,體對角線,和邊長平行的直線。體對角線肯定就只有4條不能再多了。面對角線一個面2條,一共3*n個面,總共6*n條。
和邊長平行的直線,為不重複計算,計算貫穿兩個對面的直線,共n*n條,一共3個兩對面,所以是3*n*n。那公式就是
ans=3*n*n+6*n+4
簡單粗暴,唯一可以坑人的地方什麼n=1或者高精都沒有。
(小插曲:記憶體限制10M,剛開始用bits/stdc++.h的統統RE)
程式碼如下:
#include <cstdio>
using namespace std;
int n;
int main(){
//freopen("tictac.in","r",stdin);
//freopen("tictac.out","w",stdout);
scanf("%d",&n);
if(n==1) return puts("1"),0;
printf("%d",3*n*n+6*n+4);
return 0;
}
T2題解
樹形DP,硬上就好了,把算過的答案記下來,打上標記,
碰到直接用,然後細節注意某些東西=0或者=1的情況。還有就是不要把標記return出去(尷尬臉)。
程式碼如下:
#include <cstdio>
#include <iostream>
#define G ch=getchar()
#define M 110
#define inf 10000010
using namespace std;
int rp[M],l[M],r[M],f[M][M];bool g[M][M];
int n,i,j,k;
inline int read(){
int x=0,f=1;char G;
while(ch<48||ch>57){if(ch=='-') f=-1;G;}
while(ch>47&&ch<58) x=x*10+ch-48,G;return x*f;
}
int dp(int x,int k){
if(g[x][k]) return f[x][k];
if(k==0) return f[x][k]=0;
if(x==0) return f[x][k]=-inf;
if(k==1) return f[x][k]=rp[x];
int mx=-inf;
for(int t,i=0;i<k;i++){
t=dp(l[x],i)+dp(r[x],k-i-1)+rp[x];
if(t>mx) mx=t;
}f[x][k]=mx;g[x][k]=1;return mx;
}
int main(){
for(n=read(),k=read(),i=2;i<=n;i++) rp[i]=read();
for(i=1;i<=n;i++) l[i]=read(),r[i]=read();
printf("%d",dp(1,k+1));return 0;
}
忘了把讀入優化刪了,懶得刪。
T3題解
分類討論,分六種情況(實際上是五種)。
4、5是同一種,列舉每一種形態,旋轉、跳躍,更新答案。可以開個陣列打標記,輸出答案的時候就好了。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
int i,mx=10000;
int ans[1000],ch[8],ku[8];
void swap(int *a,int *b){
int t;t=*a;*a=*b;*b=t;
}
void rec(int x,int y){
if(x*y<mx) mx=x*y,memset(ans,0,sizeof(ans));
if(x*y==mx) ans[x]=ans[y]=1;
}
void cal(int a1,int b1,int a2,int b2,int a3,int b3,int a4,int b4){
int x,y;
//case 1:
x=a1+a2+a3+a4;
y=max( max(b1,b2) ,max(b3,b4) );
rec(x,y);
//case 2:
x=max(a1+a2+a3,a4);
y=max(max(b1,b2),b3)+b4;
rec(x,y);
//case 3:
x=max(a1+a2,a3)+a4;
y=max(max(b1+b3,b2+b3) ,b4);
rec(x,y);
//case 4:
x=a1+a2+max(a3,a4);
y=max(max(b1,b3+b4),b2);
rec(x,y);
//case 5:
y=max(b1+b3,b2+b4);
if(b3>=b2+b4) x=max( max(a1,a3+a2),a3+a4);
else if( b3>b4 && b3<b2+b4 ) x=max( max(a1+a2,a2+a3),a3+a4);
else if( b4>b3 && b4<b1+b3 ) x=max( max(a1+a2,a1+a4),a3+a4);
else if( b4>=b1+b3) x=max( max(a2,a1+a4) ,a3+a4);
else if(b3==b4) x=max(a1+a2,a3+a4);
rec(x,y);
}
inline void work(){
for(int a=0;a<4;a++){
swap(ch+1,ch+1+a);swap(ku+1,ku+1+a);
for(int b=1;b<4;b++){
swap(ch+2,ch+1+b);swap(ku+2,ku+1+b);
for(int c=2;c<4;c++){
swap(ch+3,ch+1+c);swap(ku+3,ku+1+c);
for(int d=3;d<4;d++){
swap(ch+4,ch+1+d);swap(ku+4,ku+1+d);
for(int e=1;e<=3;e++){
swap(ch[1],ku[1]);
for(int f=1;f<=3;f++){
swap(ch[2],ku[2]);
for(int g=1;g<=3;g++){
swap(ch[3],ku[3]);
for(int h=1;h<=3;h++){
swap(ch[4],ku[4]);
cal(ch[1],ku[1],ch[2],ku[2],ch[3],ku[3],ch[4],ku[4]);
}
}
}
}swap(ch+4,ch+1+d);swap(ku+4,ku+1+d);
}swap(ch+3,ch+1+c);swap(ku+3,ku+1+c);
}swap(ch+2,ch+1+b);swap(ku+2,ku+1+b);
}swap(ch+1,ch+1+a);swap(ku+1,ku+1+a);
}
}
int main(){
for(i=1;i<=4;i++) scanf("%d%d",&ch[i],&ku[i]);
work();printf("%d\n",mx);
for(i=0;i<=(int)sqrt(mx);i++)
if(ans[i]) printf("%d %d\n",i,mx/i);
return 0;
}
全是Tab佔空間!
不開心,rating掉得簡直不能看了