int base = nums[begin]; int orgin_begin = begin; int orgin_end = end; int flag = 1; while (end>begin) { if (flag) { if (nums[end] < base) { flag = 0; continue; } end--; } else {
if (nums[begin] > base) { flag = 1; int tmp = nums[begin]; nums[begin] = nums[end]; nums[end] = tmp; continue; } begin++; } } int tmp = nums[begin]; nums[begin] = base; nums[orgin_begin] = tmp; q_sort(nums, orgin_begin, begin - 1); q_sort(nums, begin + 1, orgin_end); }
intmain() { int n; scanf("%d",&n); int *num = (int*)malloc(sizeof(int)*n); for (int i = 0; i < n; i++) { scanf("%d", num + i); }
q_sort(num,0,n-1);//注意这里要是n-1
for (int i = 0; i < n; i++) { printf("%d ", num[i]); } return0; }
intpartition(int* nums, int begin, int end){ int pivot = nums[begin]; // 选择第一个元素作为基准 int i = begin + 1, j = end; while (true) { while (i <= j && nums[i] < pivot) i++; while (i <= j && nums[j] > pivot) j--; if (i >= j) break; swap(nums[i++], nums[j--]); } swap(nums[begin], nums[j]); // 将基准值放到正确的位置 return j; // 返回基准值的索引 }
voidq_sort(int* nums, int begin, int end){ if (begin < end) { int pivot_index = partition(nums, begin, end); // 获取基准值的索引 q_sort(nums, begin, pivot_index - 1); // 对基准值左边的部分进行递归排序 q_sort(nums, pivot_index + 1, end); // 对基准值右边的部分进行递归排序 } }
intmain(){ int n,q; scanf("%d %d",&n,&q); map<int,int> map_begin; map<int,int> map_end; int last=-1; int now =0; for(int i=0;i<n;i++){ scanf("%d",&now); if(!i){ last=now; map_begin[now]=i;
// 找到对应节点的根 intfind(int i){ int j=i; while (num[j]) { j = num[j]; } // 找到根节点后进行路径优化 while (num[i]&&num[i]!=j) {//num[i]为0就不用优化了 int next = num[i]; num[i] = j; i = next; } return j; }
intmain(){ int n, m; cin >> n >> m; char oper; int a, b; for (int i = 0; i < m; i++) { cin >> oper >> a >> b; int root_a = find(a); int root_b = find(b); if (oper == 'M') { if (root_b != root_a) { num[root_b] = root_a; } } else { if (root_a != root_b) cout << "No"<<endl; else cout << "Yes" << endl; } } return0; }
voidbacktrack(vector<int> vi, int l){//l:已经确定l位 if (l == vi.size()) { for (int i = 0; i < l; i += 1) { cout << vi[i] << ' '; }cout << endl; return; } for (int i = l; i < vi.size(); i += 1) { swap(vi[l],vi[i]); backtrack(vi, l + 1); //swap(vi[l], vi[i]);//这里交换了就不是字典序了 } }
intmain(){ int n; cin >> n; vector<int> vi(n); for (int i = 0; i < n; i += 1) { vi[i] = i+1; } backtrack(vi, 0); return0; }
说实话,我也不是很懂为什么回溯的结束交换一下就不是字典序了,不交换就正确了,所以最好不要用
但是可以看下面这种解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
defdfs(path, visited, n): iflen(path) == n: print(' '.join(map(str, path))) return for i inrange(1, n + 1): ifnot visited[i]: visited[i] = True path.append(i) dfs(path, visited, n) path.pop() visited[i] = False
usingnamespace std; int vi[100002]; int n; boolcheck(int now){//now is new to the solution //任意两个皇后都不能处于同一行、同一列或同一斜线上 int r=now, c=vi[now]; for (int i = 0; i < now; i++) { if (vi[i] == c) { returnfalse; } if (abs(i - r) == abs(c - vi[i])) { returnfalse; } } returntrue; }
voidbacktrack(int vi[], int l){//0->l-1 is selected if (l == n) { for (int i = 0; i < l; i += 1) { for (int j = 0; j < l; j++) { if (j == vi[i]) cout << "Q"; else cout << "."; }cout << endl; }cout << endl; return; } for (int i = l; i < n; i += 1) { swap(vi[l],vi[i]); if(check(l)) backtrack(vi, l + 1); swap(vi[l], vi[i]);//这里一定要恢复现场 } }
intmain(){ cin >> n; for (int i = 0; i < n; i += 1) { vi[i] = i; } backtrack(vi, 0); return0; }
classpoint { public: staticint cout; static set<int> zero_in; int id; set<int> in; set<int> out; point() { id = cout++; if(id)zero_in.insert(id); } voidremove(int id){ in.erase(id); if (in.empty()) { zero_in.insert(this->id); } } }; int point::cout = 0; set<int> point:: zero_in=set<int>();
intmain(){
int n, m; cin >> n >> m; string result; //point* p = new point[n]; vector<point> p(n+1); set<int> res; for (int i = 1; i <= n; i++) { res.insert(i); } for (int i = 0; i < m; i++) { int a, b; cin >> a >> b; p[a].out.insert(b); point::zero_in.erase(b); p[b].in.insert(a); } while (point::zero_in.size()) { int pi = *(point::zero_in.begin()); point::zero_in.erase(pi); res.erase(pi); for (auto i = p[pi].out.begin(); i != p[pi].out.end(); i++) { p[*i].remove(pi); } result = result + to_string(pi)+' ';
usingnamespace std; constint N = 502; constint M = 2 * 1e5 + 10; int flag[N]; int e[M],ne[M], h[M],w[M],idx; int ans; voidadd(int a, int b, int x){ e[idx] = b; w[idx] = x; ne[idx] = h[a]; h[a] = idx++; } intmain(){ memset(h, -1, sizeof h); //初始化h数组 -1表示尾节点 memset(flag, false, sizeof flag); //初始化h数组 -1表示尾节点 typedef pair<int, int> PII;//堆里存储距离和节点编号 priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> heap;//小根堆
int n, m; cin >> n >> m; for (int i = 0; i < m; i++) { int u, v, x; cin >> u >> v >> x; if (u == v)continue; add(u, v, x); add(v, u, x); } int cnt = 0; heap.push({ 0,1 });
while (heap.size()) { int x = heap.top().first; int p = heap.top().second; heap.pop(); if (flag[p]) continue; flag[p] = true; ans += x; cnt++; for (int i = h[p]; i != -1; i = ne[i]) { int j = e[i]; if (!flag[j]) heap.push({ w[i], j }); } } if (cnt == n) cout << ans; else cout << "impossible"; return0; }
// 判断是否为质数 boolisPrime(int m){ if (m == 1)returnfalse; int t = sqrt(m)+1; for (int i = 2; i < t; i++) { if ((!(m % i))&&m!=i) { returnfalse; } } returntrue; }
vector<int> ps = {2,3,5};//质数数组
intmain(){ int n,m; cin >> n; for (int i = 0; i < n; i++) { cin >> m; // 当前已经遍历到质数数组的第j个 int j = 0; while (m != 1) { int cnt = 0; if (j == ps.size()) { // 遍历到最后一个了 需要扩充 int k = ps[ps.size() - 1]+1; while (!isPrime(k)) { k++; } ps.push_back(k); //cout << "扩充质数队列" << k << endl; if (k > sqrt(m) + 1) { // 这个后面说 cout << m << ' ' << 1<< endl; break; } } while(!(m % ps[j])) { // 约分 if (!cnt) { cout << ps[j] << ' '; } cnt++; //cout << "除以一次" << ps[j] << endl; m /= ps[j]; } if (cnt) { // 该质数已经分析完毕 需要开始分析下一个质数 cout << cnt << endl; } // 下一个 j++; } cout << endl; } return0; }
关于这一步的添加:
1 2 3 4 5
if (k > sqrt(m) + 1) { // 这个后面说 cout << m << ' ' << 1<< endl; break; }
for (longlong i = 1; i <= n; i++) { // 寻找所有数的质因数 cin >> m; for (longlong j = 2; j <= m / j; j++) { while (m % j == 0) { mii[j]++; m /= j; } } if (m > 1) { mii[m]++; } } for (auto i = mii.begin(); i != mii.end(); i++) { longlong a = i->first; longlong b = i->second; longlong t = 1; while (b--) { // 这里不用等比数列求和的原因是怕临时和太大 t = (t * a + 1) % mod1; } res = res * t % mod1; } cout << res; return0; }