- 123456789中插入+/
#include <stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
#include<sstream>
#include<string>
int parse(const char *arr, int pos, int len){
int ansx = 0;
int t=1;
for(int i=pos+len-1;i>=pos;--i){
ansx +=(arr[i]-'0')*t;
t = t*10;
}
return ansx;
}
int main(){
int n, ans=0;
scanf("%d", &n);
std::string s = "123456789";
const char *str = s.c_str();
do{
for(int i =1; i<=7; ++i){
int inta = parse(str, 0, i);
if(inta >= n)break;
for(int j=1;j<=9-i-1;++j){
int intb = parse(str, i, j);
int intc = parse(str, i+j,9-i-j);
if((intb%intc==0)&&(inta+intb/intc==n))ans++;
}
}
}while(std::next_permutation(s.begin(),s.end()));
cout<<ans;
}
- 区间[L,R]内使arr[L]到arr[R]排序后连续
#include<iostream>
using namespace std;
int n;
int arr[50000];
int main(int argc, const char *argv[]){
int ans=0;
scanf("%d", &n);
for(int i=0;i<n;i++){
scanf("%d", &arr[i]);
}
for(int j=0;j<n;j++){
int min = arr[j];
int max =arr[j];
for(int i=j;i<=n-1;i++){
if(i==j)ans++;
else{
if(arr[i]>max)max=arr[i];
if(arr[i]<min)min=arr[i];
if(max-min+1==i-j+1)ans++;
}
}
}
cout<<ans;
return 0;
}
- 大数加法
string add(string a,string b){
a = a.substr(a.find_first_not_of("0"));
b = b.substr(b.find_first_not_of("0"));
long long lenA=a.length();
long long lenB=b.length();
long long len=max(lenA,lenB)+10;
string ans(len,'0');
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
for(int i=0;i < lenA; i++){
ans[i]=a[i];
}
int tmp=0;
for(int i = 0; i < len; i++){
if(i<b.length()){
tmp+=((ans[i]-'0')+(b[i]-'0'));
}
else{
tmp+=ans[i]-'0';
}
ans[i]=tmp%10+'0';
tmp/=10;
}
reverse(ans.begin(),ans.end());
return ans.substr(ans.find_first_not_of("0"));
}
4.模拟除法
for(int i=0;i<100;i++)
{
a[i]=b/c;
b=(b%c)*10;
cout<<a[i];
}
- 辗转相除,枚举
#include <iostream>
using namespace std;
int gcd(int a,int b){
if(b==0)return a;
gcd(b, a%b);
}
int main()
{
int ans=0;
for(int a=1;a<=9;a++){
for(int b=1;b<10;b++){
for(int c=1;c<10;c++){
for(int d=1;d<10;d++){
if(a!=b&&c!=d){
if(a*c/gcd(a*c,b*d)==(a*10+c)/gcd(a*10+c,b*10+d)&&b*d/gcd(a*c,b*d)==(b*10+d)/gcd(a*10+c,b*10+d)){
ans++;
}
}
}
}
}
}
cout<<ans;
}
- 迭代
#include <iostream>
using namespace std;
int ans=0;
void diedai(int jiu,int dian, int hua){
if(dian==5&&hua==9&&jiu ==1)ans++;
if(dian<5)diedai(jiu*2,dian+1,hua);
if(hua<9)diedai(jiu-1,dian,hua+1);
return;
}
int main()
{
diedai(2,0,0);
cout<<ans;
}
7.全排列+vector类模板的push_back,塞入vector最后
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
void check(vector<int> v);
int main()
{
vector<int> v;
v.push_back(2);
for(int i=4;i<=7;i++){
v.push_back(i);
}
for(int i=9;i<=12;i++){
v.push_back(i);
}
do{
check(v);
}
while(next_permutation(v.begin(),v.end()));
}
void check(vector<int> v){
int r1 = 1+v[0]+v[3]+v[5];
int r2 = 1+v[1]+v[4]+v[8];
int r3 = 8+v[0]+v[1]+v[2];
int r4 = 11+v[3]+v[6];
int r5 = 3+v[2]+v[4]+v[7];
int r6 = v[5]+v[6]+v[7]+v[8];
if(r1==r2&&r2==r3&&r3==r4&&r4==r5&&r5==r6){
for(int i=0;i<=8;i++){
cout<<v[i]<<" ";
}
}
}
- 蚂蚁感冒
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
void check(vector<int> v);
int main()
{
int n;
scanf("%d", &n);
int arr[n];
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
int x = arr[0];
int ans=1;
if(x>0){
for(int i =0;i<n;i++){
if(arr[i]<0&&-arr[i]>x){
ans++;
}
}
if(ans!=1){
for(int i=0;i<n;i++){
if(arr[i]>0&&arr[i]<x){
ans++;
}
}
}
}
if(x<0){
for(int i =0;i<n;i++){
if(arr[i]>0&&arr[i]<-x){
ans++;
}
}
if(ans!=1){
for(int i=0;i<n;i++){
if(arr[i]<0&&-arr[i]>-x){
ans++;
}
}
}
}
cout<<ans;
}
- dfs迷宫问题
#include <iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
int n, m, k;
int data[50][50];
long long ans;
const int MOD = 1000000007;
void dfs2(int x,int y,int max,int cnt){
if(x==n||y==m||cnt>k)
return;
int cur =data[x][y];
if(x==n-1&&y==m-1){
if(cnt==k||(cnt==k-1&&cur>max)){
ans++;
if(ans>MOD)
ans%=MOD;
}
}
if(cur>max){
dfs2(x,y+1,cur,cnt+1);
dfs2(x+1,y,cur,cnt+1);
}
dfs2(x,y+1,max,cnt);
dfs2(x+1,y,max,cnt);
}
int main()
{
scanf("%d %d %d", &n,&m,&k);
for(int i =0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d", &data[i][j]);
}
}
dfs2(0,0,-1,0);
cout<<ans;
return 0;
}
- 求最大公约数,最大公倍数
#include <iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
int gcd(int a,int b){
if(b==0)return a;
gcd(b,a%b);
}
int main()
{
int a,b,c;
cin>>a>>b>>c;
int ab = a*b/gcd(a,b);
int ans = ab*c/gcd(ab,c);
cout<<ans;
}
- 插入排序
void charu(int a[],int n){
int j;
for(int i=0;i<n;i++){
int tmp = a[i];
for(j=i-1;j>=0&&a[j]>tmp;j--){
a[j+1]=a[j];
}
a[j+1]=tmp;
}
}
- 十六进制转为十进制
int main()
{
int n;
cin>>n;
string a[15];
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
int sum;
for(int j=0;j<a[i].length();j++){
if(a[i][j]>='A'&&a[i][j]<='F'){
sum = sum*16+a[i][j]-'A'+10;
}
else{
sum = sum*16+a[i][j]-'0';
}
}
int b[100000];
int p=0;
int num=0;
while(sum!=0){
b[p++] = sum%8;
sum=sum/8;
num++;
}
for(int i=num-1;i>=0;i--){
if(b[i]==0)continue;
cout<<b[i];
}
cout<<endl;
}
return 0;
}
- 递归回溯全排列]
void f(int x[], int k){
int i,t;
if(k>=9){
test(x);
return ;
}
for(i=k;i<9;i++){
{t=x[k],x[k]=x[i];x[i]=t};
f(x,k+1);
{t=x[k],x[k]=x[i];x[i]=t};
}
}
- stl之map的使用
- stl之set的使用
- stl之vecror的使用
- 十进制转化为任意进制
string ten2other(int n, int radix){ //是待转十进制数,radix是制定的进制
string ans = "";
do{
int t=n%radix;
if(t>=0&&t<=9)ans+=t+'0';
else ans+=t-10+'A';
n/=radix;
}while(n!=0);
reverse(ans.begin(),ans.end());
return ans;
}
- 任意进制转化为十进制
int other2ten(string n, int radix){ //n是给定的radix进制的字符串
int ans;
for(int i=0;i<n.size();i++){
char t = n[i];
if(t>='0'&&t<='9')ans=ans*radix+t-'0';
else ans=ans*radix+t-'A'+10;
}
return ans;
}
- int转化为string
void i2s(int num,string &pai){
stringstream ss;
ss<<num;
ss>>str
}
- 快速幂
//递归
long long pow1(int a,int b){
if(b==0)
return 1;
if(b&1){
return a*pow(a,b-1);
}else{
long long mul;
mul=pow(a,b/2);
return mul*mul;
}
}
//循环
long long pow2(int base, int exp)
{
long long result = 1;
while(1){
if (exp & 1)
result *= base;
exp >>= 1;
if (!exp)
break;
base *= base;
}
return result;
}
int poww(int a, int b) {
int ans = 1, base = a;
while (b != 0) {
if (b & 1 != 0)
ans *= base;
base *= base;
b >>= 1;
}
return ans;
}
链表的使用list:
1.push_back()
2.begin()
3.erase()
4.insert()
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#include<queue>
#include<functional>
#include<list>
int main() {
int n, m;
cin >> n >> m;
list<int>l;
for (int i = 0; i < n; i++) {
l.push_back(i + 1);
}
while (m--) {
int a, b;
cin >> a >> b;
list<int>::iterator i = l.begin();
while (*i != a) {
i++;
}
i = l.erase(i);
while (b < 0) {
i--;
b++;
}
while (b > 0) {
i++;
b--;
}
l.insert(i, a);
}
for (list<int>::iterator i = l.begin(); i != l.end(); i++) {
cout << *i;
}
return 0;
}
vertor:
- size()
- push_back()
- begin()
- end()
- vectorv(10) 10个元素
- resize()
set:元素各不相同
- sets
- insert()
- begin()
- end()
- find()
map: - map<string ,int>m
- begin()
- end()
- size()
- m[“sss”]=2
stack: - stacks
- top()
- size()
- push()
- pop()
queue: - push()
- pop()
- front()
- back()
- size()