先放课程表:
幻方(sqr.cpp/sqr.in/sqr.out):
1
1 2 15 16
12 14 3 5
13 7 10 4
8 11 6 9
retrun
(在My Classmate's Code中没有用到这一剪枝)。#include <bits/stdc++.h>
using namespace std;
int used[17];
int k;
int ary[4][4];
int found=0;
void print(){
int i,j;
for (i=0;i<4;i++){
for(j=0;j<3;j++){
cout<<ary[i][j]<<" ";
}
cout<<ary[i][3]<<endl;;
}
return;
}
void dfs(int n) {
int x= n/4,y=n%4;
int i;
if (found) return;
if (n==16) {
k--;
if (k==0) {
print();
found=1;
}
return;
}
for (i=1;i<=16;i++){
if (!used[i]){
if(x==3&&(ary[0][y]+ary[1][y]+ary[2][y]+i)!=34)
continue;
if(y==3&&(ary[x][0]+ary[x][1]+ary[x][2]+i)!=34)
continue;
if(x==3&&y==0&&(ary[0][3]+ary[1][2]+ary[2][1]+i)!=34)
continue;
if(x==3&&y==3&&(ary[0][0]+ary[1][1]+ary[2][2]+i)!=34)
continue;
used[i]=1;
ary[x][y]=i;
dfs(n+1);
used[i]=0;
}
}
}
int main(){
freopen("sqr.in","r",stdin);
freopen("sqr.out","w",stdout);
int i;
cin>>k;
for (i=1;i<=16;i++)
used[i]=0;
dfs(0);
return 0;
}
二分图匹配(match.cpp/match.in/match.out):
保证图中不存在自环。
4 4
1 2
2 3
3 4
4 1
2
1 3
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 30;
const int MAXM = 30;
struct edge {
int u, v;
};
int n, m, ans = 0;
edge e[MAXM];
bool vis[MAXN], sel[MAXM], sel_ans[MAXM];
void dfs(int x, int cnt) {
if (x == m + 1) {
if (cnt > ans) {
ans = cnt;
for (int i = 1; i <= m; i++)
sel_ans[i] = sel[i];
}
return;
}
if (!vis[e[x].u] && !vis[e[x].v]) {
vis[e[x].u] = vis[e[x].v] = 1;
sel[x] = 1;
dfs(x + 1, cnt + 1);
vis[e[x].u] = vis[e[x].v] = 0;
}
sel[x] = 0, dfs(x + 1, cnt);
}
int main() {
freopen("match.in", "r", stdin);
freopen("match.out", "w", stdout);
cin >> n >> m;
for (int i = 1; i <= m; i++)
cin >> e[i].u >> e[i].v;
dfs(1, 0);
cout << ans << endl;
for (int i = 1; i <= m; i++)
if (sel_ans[i])
cout << i << " ";
return 0;
}
这次考试突出我最大的问题是Code写得丑,比较简单的$dfs$总是写得很长。我的剪枝也要多练习吧(这几天好像都说要多练习),今天和明天的笔记和考试订正可能会缩水,我会多写一些题目的题解。
算法:
算法:
算法:先对数据进行升序排列
int l = 1, r = n;
while (l < r) {
int mid = (l +r) / 2;
if (v <= a[mid])
r = mid;
else
l = mid + 1;
}
算法:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
inline int in(){
int X=0,w=0; char ch=0;
while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
return w?-X:X;
}
inline void out(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) out(x/10);
putchar(x%10+'0');
return;
}
int f[100005][50],n,m,data[100005],l,r;
int main(){
n=in();
m=in();
for (int i=1;i<=n;i++)
data[i]=in(),f[i][0]=data[i];
int t=n,Max=0;;
for(int j=1;j<=21;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
for (int i=1;i<=m;i++){
l=in();
r=in();
int k=log2(r-l+1);
out(max(f[l][k],f[r-(1<<k)+1][k]));
printf("\n");
}
return 0;
}
$Vector$变长数组:
声明:
vector<int> arr;// 声明初始长度为0的int类型的vector
vector<int>arr(7); // 声明初始长度为7的vector,所有元素进行默认初始化
vector<int>arr(4,2); // 声明初始长度为4,且所有元素全部为2的vector
用法:
//普通方法
for (int i = 0; i < arr.size(); i++)
cout << arr[i] << " ";
//使用迭代器
for (vector<int>::iterator it = arr.begin(); it != arr.end(); it++)
cout << *it << endl;
$stack$栈
stack<int>s;
用法:
$queue$队列
queue<int>q;
用法:
$priority$_$queue$优先队列
priority_queue<int>q;
(默认为大根堆)用法:
priority_queue<int,vector<int>,greater<int>>q;
今天的模拟赛有点难吧,T2是用$dfs$做的,只能50分了QAQ。最后一题好像是$LCA$问题,数据范围应该允许使用暴力解决$LCA$问题,然鹅我打了个$Floyd$。不能上200了,嘤嘤嘤。
本文作者:Snowflake_Pink
本文链接:https://snowflake.pink/archives/10/
最后修改时间:2020-04-13 11:09:52
本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!