Offer收割 程式設計練習賽1

2021-07-10 07:51:26 字數 3831 閱讀 8731

做了三題,題目都比較暴力。

a題 題意:給你乙個三階的幻方,三階幻方指的是將1~9不重複的填入乙個3*3的矩陣當中,使得每一行、每一列和每一條對角線的和都是相同的。現在準備將乙個三階幻方中的一些陣列抹掉(0代替),交給你來進行還原,並且希望她能夠判斷出究竟是不是只有一組解。

如果只有一組解,輸出該三階幻方。如果多組解,輸出「too many」。(題目保證有解)

題解:純暴力,列舉被抹去位置的情況,並且判重加記錄就可以做出來。時間複雜度o(9!)。

**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#define pi 2*asin(1.0)

#define ll long long

#define pb push_back

#define pa pair#define clr(a,b) memset(a,b,sizeof(a))

#define lson lr<<1,l,mid

#define rson lr<<1|1,mid+1,r

#define bug(x) printf("%d++++++++++++++++++++%d\n",x,x)

#define key_value ch[ch[root][1]][0]

const int mod = 1000000007;

const int n = 1e5+15;

const int maxn = 450;

const int letter = 130;

const int inf = 15000000;

const double pi=acos(-1.0);

const double eps=1e-8;

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}int c[20],b[20],a[20],vis[20],dis[20],sum=0;

bool solve(int x,int y,int z)

void dfs(int x,int f)

return;

}if(a[x+1]) dfs(x+1,a[x+1]);

else for(int i=1;i<=9;i++)

}int main()

}else puts("too many");

return 0;

}

b題:

題意:(中文題簡單易懂)

題解:我們注意到隨著快取區k的增大,總延遲懲罰是在減少的,再看n的的大小只有100000,直接二分可做,並且可以利用優先佇列維護最大值即可。

時間複雜度o(logn*logn)

**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#define pi 2*asin(1.0)

#define ll long long

#define pb push_back

#define pa pair#define clr(a,b) memset(a,b,sizeof(a))

#define lson lr<<1,l,mid

#define rson lr<<1|1,mid+1,r

#define bug(x) printf("%d++++++++++++++++++++%d\n",x,x)

#define key_value ch[ch[root][1]][0]

const int mod = 1000000007;

const int n = 1e5+15;

const int maxn = 450;

const int letter = 130;

const int inf = 1e17;

const double pi=acos(-1.0);

const double eps=1e-8;

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}ll n,ps,a[n];

bool solve(ll x)

while(!q.empty())

/// printf("%lld %lld\n",x,sum);

return 1;

}int main()

else

}if(ans!=inf)printf("%lld\n",ans);

else puts("-1");

return 0;

}

c題

題意:(中文題簡單易懂)

題解:仔細分析下可以看出是完全揹包,但是有一些要注意的。揹包的容量應該為2*k,因為建築值肯定要超過k的。而且注意特判下,當建築值大於等於k的時候單獨拿出來計算,因為假如我的建築值為3k 4k的時候肯定是揹包更新不到的,所以特判下。時間複雜度:o(q*n*k*m)。

**:

#pragma comment(linker, "/stack:102400000,102400000")

#include#include#include#include#include#include#include#include#include#include#include#include#include#define pi 2*asin(1.0)

#define ll long long

#define pa pair#define pb push_back

#define clr(a,b) memset(a,b,sizeof(a))

#define lson lr<<1,l,mid

#define rson lr<<1|1,mid+1,r

#define bug(x) printf("%d++++++++++++++++++++%d\n",x,x)

const int mod = 1000000007;

const int n = 100+15;

const int maxn = 2e4 + 14;

const int inf = 1e17;

const int letter = 130;

const double pi=acos(-1.0);

const double eps=1e-10;

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}int tc;

int n,m,k;

ll a[n],b[n],dp[maxn],t;

int main()

for(int x=b[j];x<=2*k;x++) dp[x]=min(dp[x-b[j]]+a[j],dp[x]);

}for(int j=k;j<=2*k;j++) ans=min(ans,dp[j]);

for(int j=1;j<=m;j++) b[j]/=t;

if(ans==inf)

sum+=ans;

}if(flag) puts("no answer");

else printf("%lld\n",sum);

}return 0;

}

Offer收割 程式設計練習賽7

比較容易想到是o n 2 的解決方案,遍歷n種刪除可能,每次遍歷o n 時間求總高度。前者優化比較困難,因而想辦法優化每次遍歷求高度的時間。由前往後遍歷,當刪除第i個時,先前的排版是連續的,從而通過計數器等累加方法可以求得已完整行的總高度presum,以及當前未完整行的w,h。include def...

Offer收割 程式設計練習賽26

題解 按照條件求解出最大的三角形和最小的三角形,然後求重心即可。這裡求解面積有兩種方法 海 式 p p a p b p c 將三角形的每一條邊求解出來,然後進行處理 用有向向量進行計算,如果設a x0,y 0 b x1,y 1 c x2,y 2 三點為三角形三個頂點,a 為有向面積,那麼2a x0 ...

Offer收割 程式設計練習賽30

題解 簡單的模擬題,大家懂的 include include include include include include include include include define fin freopen input.txt r stdin define fout freopen output...