ranqi的算法

0-1背包
#include
#include
using namespace std;
struct T
{
double weight;
double value;
double devide;
};

int n;
double c; //n件物品和背包容量c
double cw = 0, cv = 0, maxv = 0; //cw:当前重量 cv:当前价值 maxv:最大价值
T* t;

bool cmp(T t1, T t2)
{
return t1.devide > t2.devide; //按单位价值从高到低排序!!!
}

int Bound(int y) //约束函数
{
int i = y;
double leftv = 0; //理想情况下(尽量选择)剩余物品的价值
double leftw = c - cw;
while (i < n && t[i].weight <= leftw) //整块整块的装
{
leftw -= t[i].weight;
leftv += t[i].value;
i++;
}
if (i < n) //为了装满
{
leftv += t[i].devide*leftw;
}
return leftv;
}

void Back(int x)
{
if (x >= n) //递归终止条件
{
if (cv > maxv)
{
maxv = cv;
}
return;
}
//1:选择该物品
if (cw + t[x].weight <= c) //选择前先剪枝
{
cw += t[x].weight;
cv += t[x].value;
Back(x + 1);
cv -= t[x].value; //回溯
cw -= t[x].weight;
}
//0:不选择该物品
if (cv + Bound(x + 1) > maxv)
{
Back(x + 1);
}
}

int main()
{
cin >> n >> c;
t = new T[n];
for (int i = 0; i <= n; i++)
{
cin >> t[i].weight >> t[i].value;
t[i].devide = t[i].value / t[i].weight;
}
sort(t, t+n, cmp); //按照价值从大到小排序,利于剪枝
Back(0);
cout << maxv;
return 0;
}

按字典序排序还是按长度排序
#include<bits/stdc++.h>
using namespace std;
string a[10010],b[10010];
int main(){
int i,m,n,f=0,t=0;
cin>>n;
getchar();
for(i=0;i<n;i++){
getline(cin,a[i]);
b[i]=a[i];
}
for(i=1;i<n-1;i++){
if(a[i-1].size()>a[i].size())
f=1;
}
sort(a,a+n);
for(i=0;i<n;i++){
if(a[i]!=b[i])t=1;
}
if(t0&&f1)printf(“islexicalorder\n”);
else if(t1&&f0)printf(“lengths\n”);
else if(t0&&f0)printf(“both\n”);
else printf(“none\n”);
return 0;
}

A-B
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s,c;
getline(cin,s);
getline(cin,c);
for(int i=0;i<s.size();i++)
{
int f=0;
for(int j=0;j<c.size();j++)
{
if(s[i]c[j])
f=1;
}
if(f
0)
cout<<s[i];
}

多参加活动,生活才精彩
#include<bits/stdc++.h>
using namespace std;
typedef struct{
int kredit;
int b;
int e;
}TIME;
bool cmp(TIME x,TIME y)
{
return x.e<y.e;
}
int main()
{
TIME t[1000];
int n,i,pretime,cnt=0,sumKredit=0;
cin>>n;
for(i=0;i<n;i++)
{
cin>>t[i].b>>t[i].e>>t[i].kredit;
}
sort(t,t+n,cmp);
pretime=0;
for(i=0;i<n;i++)
{
if(t[i].b>=pretime)
{
pretime=t[i].e;
sumKredit+=t[i].kredit;
cnt++;
}
}
cout<<cnt<<" "<<sumKredit<<endl;
return 0;
}

找第k小的数
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
int a[n];

for(int i=0;i<n;i++)
{
    cin>>a[i];
}
sort(a,a+n);
cout<<a[k-1];

}

第 k 大的整数
#include<bits/stdc++.h>
using namespace std;
int main()
{
std::ios::sync_with_stdio(false);
int n,k;
cin>>n>>k;
int a[n];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
cout<<a[n-k];
}

查找出现过的数字
#include<bits/stdc++.h>
using namespace std;;
int main()
{
int m,n;
cin>>m>>n;
int a[m],b[n],d=0;
for(int i=0;i<m;i++)
cin>>a[i];
for(int j=0;j<n;j++)
cin>>b[j];
for(int i=0;i<n;i++){
d=0;
for(int j=0;j<m;j++)
{
if(b[i]==a[j])
d=1;

    }
    if(d==1)
        cout<<"YES"<<endl;
    else
        cout<<"NO"<<endl;
}

}

判断一个数在这个序列中出现几次
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
cin>>m;
int b[m],d[m]={0};
for(int i=0;i<m;i++)
cin>>b[i];
for(int i=0;i<m;i++)//先m
{
for(int j=0;j<n;j++)//后n
{
if(b[i]==a[j])
d[i]++;
}
}
for(int i=0;i<m;i++)
cout<<d[i]<<endl;
}

出现次数最多的数字和次数
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int a[n],d,c=0;//c是次数
int b[n];//存放结果的数组
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;i++){//外遍历
c=1;
for(int j=0;j<n;j++){//内遍历
if(a[i]==a[j])
b[i]=c++;
}
int max=b[0];//出现次数最多
if(b[i]>max){
max=b[i];
d=i;}
}
cout<<a[d]<<" "<<b[d];
}

两个有序序列的中位数
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,i,j;
cin>>n;
int a[n],b[n];
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
cin>>b[i];
i=0;j=0;
while(i+j<n-1)//谁小谁的后移
{
if(a[i]<b[j])
i++;
else
j++;
}
if(a[i]<b[j])
printf(“%d”,a[i]);
else
printf(“%d”,b[j]);
return 0;
}

两个有序链表序列的合并
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 1000010
ll a[N],b[N],c[N],pa,pb,pc,x;
int main()
{
while(1){
scanf(“%lld”,&x);
if(x==-1)break;
a[pa++]=x;
}
while(1){
scanf(“%lld”,&x);
if(x==-1)break;
b[pb++]=x;
}
ll i=0,j=0;
while(i<pa&&j<pb){
if(a[i]<b[j])c[pc++]=a[i++];
else c[pc++]=b[j++];
}
while(i<pa)c[pc++]=a[i++];
while(j<pb)c[pc++]=b[j++];
if(pc)for(ll i=0;i<pc;i++){
if(i)printf(" “);
printf(”%lld",c[i]);
}
else printf(“NULL”);
return 0;
}

大数的乘法
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[1001];
long int b,i,jin,len;
int c[1010];
while(scanf(“%s%d”,a,&b)!=EOF)
{
if(b==0)
printf(“0\n”);
else{
len=strlen(a);
jin=0;
for(i=len-1;i>=0;i–)
{
c[i]=((a[i]-‘0’)*b+jin)%10;
jin=((a[i]-‘0’)*b+jin)/10;
}
if(jin!=0)
printf(“%ld”,jin);
for(i=0;i<len;i++)
printf(“%d”,c[i]);
printf(“\n”);
}
}
return 0;
}

数列求和-加强版
#include <stdio.h>
int a[100001];
int main(void){
int A,n;
scanf(“%d %d”,&A,&n);
if(n==0) printf(“0”);//n最小的情况
else {
for(int i=1;i<=n;i++)
a[i]=A;
int t=0;
for(int i=n;i>1;i–){
a[i]=A*i+t;//对应位置的每位数字相加再加上由后一位满十要进的数
t=a[i]/10;//满十进几?
a[i]%=10;
}
a[1]=A+t;
for(int i=1;i<=n;i++){
printf(“%d”,a[i]);
}
}
return 0;
}

vector 对称排序
#include
#include
#include
#include
using namespace std;
vector v1;
vector v2;
vector::iterator it1;
vector::iterator it2;

int main()
{
int num, i, j, k, count = 0;
string temp;
while (cin >> num && num != 0)
{
v1.clear();
v2.clear();
count++;
for (i = 0; i < num; i++)
{
cin >> temp;
if (i%2 == 0)
v1.push_back(temp);
else
v2.push_back(temp);
}
reverse(v2.begin(), v2.end());

    cout << "SET " << count << endl;
	for (it1 = v1.begin(); it1 != v1.end(); it1++)
		cout << (*it1) << endl;
	for (it2 = v2.begin(); it2 != v2.end(); it2++)
		cout << (*it2) << endl;
}
return 0;

}

稳定排序stable_sort 字符串排序–string类的使用
#include<bits/stdc++.h>
using namespace std;
typedef struct node{
string s;
int id;
}node;
bool cmp(node a, node b)
{
if(a.s.length()b.s.length())
{
return a.id<b.id;
}
return a.s.length()<b.s.length();
}
int main()
{
int n;
while(cin>>n)
{
node s1;
vectorv;
getchar();
for(int i=0;i<n;i++)
{
getline(cin,s1.s);
if(s1.s
"stop") break;
s1.id=i;
v.push_back(s1);
}
sort(v.begin(),v.end(),cmp);
for(int i=0;i<v.size();i++)
{
cout<<v[i].s<<endl;
}
v.clear();
}
return 0;
}

map 气球升起来
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n){
map<string,int>mp;
while(n–){
string s;
cin>>s;
mp[s]++;
}
int maxn=0;
string str;
map<string,int>::iterator it;
for(it=mp.begin();it!=mp.end();it++){
if(it->second>maxn){
maxn=it->second;
str=it->first;
}
}
cout<<str<<endl;
}
}

map和sort 集合A-B
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 100010
int main()
{
ll n;
scanf(“%lld”,&n);
while(n–){
set a,b;
vector ans;
ll n,m,x;
scanf(“%lld %lld”,&n,&m);
for(ll i=0;i<n;i++){
scanf(“%lld”,&x);
a.insert(x);
}
for(ll i=0;i<m;i++){
scanf(“%lld”,&x);
b.insert(x);
}
for(set::iterator it=a.begin();it!=a.end();it++){
if(b.find(*it)==b.end())ans.push_back(*it);
}
if(ans.size())for(ll i=0;i<ans.size();i++){
if(i)printf(" “);
printf(”%lld",ans[i]);
}
else printf(“NULL”);
puts(“”);
}
return 0;
}

用队列queue 办事大厅排队
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
string s,name;
cin>>n;
list l;
while(n–)
{
cin>>s;
if(s==“in”)
{
cin>>name;
l.push_back(name);
}
else if(s==“out”)
{
l.pop_front();
}
else if(s==“q”)
{
if(l.empty())
{
cout<<“NULL”<<endl;
}
else
{
cout<<l.front()<<endl;
}
}
}
return 0;
}

用set 集合的“交”与“并”
#include<bits/stdc++.h>
#include
#include
using namespace std;

int main()
{
int n,m;
set a,b,sa,sb;
int x;
cin>>n>>m;
for(int i=0; i<n; i++)
{
cin>>x;
a.insert(x);
}
for(int i=0; i<m; i++)
{
cin>>x;
b.insert(x);
}
set::iterator it;
for(it=a.begin(); it!=a.end(); it++)
{
if(b.find(*it)!=b.end())
sa.insert(*it);
}
for(it=a.begin(); it!=a.end(); it++)
{
sb.insert(*it);
}
for(it=b.begin(); it!=b.end(); it++)
{
sb.insert(*it);
}
cout<<sa.size();
if(sa.size()!=0)
{
for(it=sa.begin(); it!=sa.end(); it++)
cout<<" “<<*it;
}
cout<<endl;
cout<<sb.size();
if(sb.size()!=0)
{
for(it=sb.begin(); it!=sb.end(); it++)
cout<<” "<<*it;
}
return 0;
}

用map 统计英文单词个数
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n;
while(n–){
map<string,int> mp;
cin>>m;
char s[1001];
while(m–){
scanf(“%s”,s);
mp[s]++;
}
for(auto x:mp)cout<<x.first<<" "<<x.second<<endl;
}
return 0;
}

用map 笨小猴
#include<bits/stdc++.h>
using namespace std;
#define ll long long
bool f(ll x){
if(x<2)return 0;
for(ll i=2;i<=sqrt(x);i++)
if(x%i==0)return 0;
return 1;
}
int main()
{
string s;
cin>>s;
map<char ,ll > mp;
ll Max=-2e15,Min=2e15;
for(ll i=0;i<s.size();i++){
mp[s[i]]++;
}
for(map<char ,ll >::iterator it=mp.begin();it!=mp.end();it++){
Max=max(Max,it->second);
Min=min(Min,it->second);
}
if(f(Max-Min)){
printf(“Lucky Word\n%lld”,Max-Min);
}
else printf(“No Answer\n0”);
return 0;
}

快速排序sort 第k个数
#include<bits/stdc++.h>
using namespace std;
int n,m,a[10000010];
int main()
{
int i;
scanf(“%d %d”,&n,&m);
for(i=0;i<n;i++){
scanf(“%d”,&a[i]);
}
sort(a,a+n);
cout<<a[m-1]<<endl;
return 0;
}

sdut-Collection(Map)-1 读中国载人航天史,汇航天员数量,向航天员致敬
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
map<string,int>m;
while(cin>>s)
{
if(s==“end”)
break;
else
{
m[s]++;
}
}
for(auto &it:m)
{
cout<<it.first<<" "<<it.second<<endl;
}
}

map 树种统计
#include<bits/stdc++.h>
using namespace std;
#define ll long long
map<string ,ll > mp;
int main()
{
ll n,nn;
cin>>n;getchar();nn=n;
while(n–){
string s;
getline(cin,s);
mp[s]++;
}
for(auto x:mp)printf(“%s %.4lf%%\n”,x.first.c_str(),x.second*100.0/nn);
return 0;
}

map例题 求多少对相反数
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 10010
ll a[N],b[N];
int main()
{
ll n,x,ans=0;
cin>>n;
for(ll i=0;i<n;i++){
cin>>x;
if(x>0){
a[x]=1;
if(b[x])ans++;
}
else {
x=-x;
b[x]=1;
if(a[x])ans++;
}
}printf(“%lld”,ans);
return 0;
}

求任意两个整数集合的交集、并集和差集
#include<bits/stdc++.h>
using namespace std;
int main()
{
int m,n,x,y;
seta,b,c,d,e;
cin>>m>>n;
for(int i=0;i<m;i++)
{
cin>>x;
a.insert(x);
}
for(int i=0;i<n;i++)
{
cin>>y;
b.insert(y);
}
set_intersection(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.begin()));
if(c.size()==0)
cout<<“交:”<<“NULL”;
else
{
cout<<“交:”;
for(auto i:c)
cout<<" "<<i;

}
cout<<endl;
 set_union(a.begin(),a.end(),b.begin(),b.end(),inserter(d,d.begin()));
if(d.size()==0)
    cout<<"并:"<<"NULL";
else
{
    cout<<"并:";
    for(auto i:d)
        cout<<" "<<i;
}
cout<<endl;
 set_difference(a.begin(),a.end(),b.begin(),b.end(),inserter(e,e.begin()));
if(e.size()==0)
    cout<<"差:"<<"NULL";
else
{
    cout<<"差:";
    for(auto g:e)
        cout<<" "<<g;
      
}

}

谁没有完成实验?
#include<stdio.h>
unsigned char students[1000010];
int main()
{
int N,M;
scanf(“%d”,&N);
for(int i=0;i<N;i++)
{
int v;
scanf(“%d”,&v);
students[v]=1;
}
scanf(“%d”,&M);

 for(int i=0;i<M;i++)
{
    int y;
    scanf("%d",&y);
    if(students[y]==1)
        printf("Yes\n");
     else
         printf("No\n");
}
return 0;

}

递归实现 输出全排列
#include<bits/stdc++.h>
using namespace std;
int N;
vectorv;
void swap(int arr[],int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}

string printarr(int arr[]){
stringstream st;
for(int i = 0; i < N; i++){
st << arr[i] ;
}
string str = st.str();
return str;
}
void perm(int A[],int p,int q){
if(p == q){
string str = printarr(A);
v.push_back(str);
}else{
for(int i = p; i <= q; i++){
swap(A,p,i);
perm(A,p+1,q);
swap(A,p,i);
}
}
}

int main(){
cin >> N;
int arr[10];
for(int i = 0; i < N; i++){
arr[i] = i + 1;
}
perm(arr,0,N-1);
sort(v.begin(),v.end());
for(int i = 0; i < v.size(); i++){
cout << v[i] << endl;
}
}

递归实现 根据后序和中序遍历输出先序遍历
#include <bits/stdc++.h>
using namespace std;
void getpre(int *a,int *b,int n)
{
if(n>0)
{
int root = a[n-1];
int i;
for(i=0;i<n;i++)
{
if(b[i] == root)
{
break;
}
}
cout << " " << root;
getpre(a, b, i);
getpre(a+i, b+i+1, n-i-1);
}
}
int main()
{
int n;
cin >> n;
int a[n],b[n],c[n];
for(int i=0;i<n;i++)
{
cin >> a[i];
}
for(int i=0;i<n;i++)
{
cin >> b[i];
}
cout << “Preorder:”;
getpre(a,b,n);
return 0;
}

递归实现 八皇后问题(*)
#include
#include<math.h>
#include<string.h>
using namespace std;
int n, *x,m=1;
long num;
char a[80000][50];
bool check(int k) {
for (int j = 1; j < k; j++) {
if (abs(k - j) == abs(x[j] - x[k]) || (x[j] == x[k]))
{
return false;
}
}
return true;
}
void backtrack(int k) {
int i;
if (k > n) {
num++;
for ( i = 1; i <= n; i++)
{
a[m][x[i]] = ‘Q’;
m++;
}
}
else
{
for ( i = 1; i <= n; i++)
{
x[k] = i;
if (check(k))
{
backtrack(k + 1);
}
}
}
}
int main() {
memset(a, ‘.’, sizeof(a));
cin >> n;
x = new int[n + 1];
backtrack(1);
for (int i = 1; i < m; i++)
{
for (int j = 1; j <= n; j++)
{
cout << a[i][j];
if (j < n)cout << " ";
}
cout << endl;
if (i%n == 0&&i!=m-1) { cout << endl; }
}
if (num == 0)
cout << “None”;
delete[]x;
return 0;
}

二分查找
#include
using namespace std;
extern int sum=0;
int BinarySearch(int a[],const int &x,int n)
{
int left = 0;
int right = n-1;
while (left <= right)
{
sum++;
int middle = (left + right)/2;
if(x == a[middle]) return middle;
if(x > a[middle]) left = middle + 1;
else right = middle - 1;
}
return -1;
}

int main()
{
int n,a[1000],x,result;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
cin>>x;

result = BinarySearch(a,x,n);
cout<<result<<endl<<sum;
return 0;

}

棋盘覆盖
#include
using namespace std;
#define N 90
int board[N][N];
int tile=1;
void chessboard(int tr,int tc,int dr,int dc,int size)
{
if(size==1)
return;
int t=tile++;
int s=size/2;
if(dr<tr+s&&dc<tc+s)
chessboard(tr,tc,dr,dc,s);
else
{
board[tr+s-1][tc+s-1]=t;
chessboard(tr,tc,tr+s-1,tc+s-1,s);
}
if(dr<tr+s&&dc>=tc+s)
chessboard(tr,tc+s,dr,dc,s);
else
{
board[tr+s-1][tc+s]=t;
chessboard(tr,tc+s,tr+s-1,tc+s,s);
}

if(dr>=tr+s&&dc>=tc+s)
    chessboard(tr+s,tc+s,dr,dc,s);
else
{
    board[tr+s][tc+s]=t;
    chessboard(tr+s,tc+s,tr+s,tc+s,s);
}    if(dr>=tr+s&&dc<tc+s)
    chessboard(tr+s,tc,dr,dc,s);
else
{
    board[tr+s][tc+s-1]=t;
    chessboard(tr+s,tc,tr+s,tc+s-1,s);
}    

}
int main()
{
int aa,bb,length;
cin>>aa>>bb>>length;
chessboard(1,1,aa,bb,length+1);
int i,j;
for(i=1;i<=length;i++)
{
for(j=1;j<=length;j++)
printf(“%4d”,board[i][j]);
cout<<endl;
}

}

输油管道问题
#include
#include<stdlib.h>
using namespace std;
int partition(int a[],int first,int end)
{//快排
int x=a[first];
while(first<end)
{
while(first<end&&a[end]>=x)
end–;
a[first]=a[end];
while(first<end&&a[first]<=x)
first++;
a[end]=a[first];
}
a[first]=x;
return first;
}
int find(int a[],int first,int end,int k)
{//找中位数即可
if(firstend)
return a[first];
int p=partition(a,first,end);
if(p
k)
return a[p];
else if(k<p)
return find(a,first,p-1,k);
else find(a,p+1,end,k);
}
int main()
{
int a[10005],b[10005];
int n,mid,sum=0;
cin>>n;
for(int i=0;i<n;i++)
cin>>b[i]>>a[i];

mid=find(a,0,n-1,n/2);//找合适位置
for(int i=0;i<n;i++)
{
	sum=sum+abs(a[i]-mid);
 }

 cout<<sum;
 return 0; 

}

循环日程表
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,half=1;
int a[129][129];
scanf(“%d”,&n);
a[0][0]=1;
int m=1<<n;
do
{
for(int i=0;i<half;i++)
for(int j=0;j<half;j++)
a[i][j+half]=a[i][j]+half;
for(int i=0;i<half;i++)
for(int j=0;j<half;j++)
{
a[i+half][j]=a[i][j+half];
a[i+half][j+half]=a[i][j];
}
half*=2;
}while(half<=m);
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
printf(“%d “,a[i][j]);
printf(”\n”);
}
return 0;
}

正整数n不同分解式的个数、
#include
#include
using namespace std;
vector factor;
int total=0;
int num;
void output()
{
vector::iterator v;
v = factor.begin();
while(v!=factor.end())
{

    v++;
}

}
void solve(int n)
{
if(n == 1)
{
total++;

    output();//输出向量中的元素
}
else
    for(int i = 2; i <= n; i++)
        if (n % i == 0)
        {
            //如果i是n的因子,则将i压入栈
            factor.push_back(i);
            solve(n / i);
            factor.pop_back();
        }

}

int main()
{
cin>>num;
solve(num);
cout<<total;
return 0;
}

找完数
#include<stdio.h>
int main()
{
int factors(int x);
int i, j, m, n, flag = 0;
scanf(“%d %d”, &m, &n);
for (i = m; i <= n; i++)
if (i == factors(i))
{
flag = 1;
printf(“%d = 1”, i);
for (j = 2; j < i; j++)
if (i%j == 0)
printf(" + %d", j);
printf(“\n”);
}
if (flag == 0)printf(“None\n”);
return 0;
}
int factors(int x)
{
int sum = 0;
for (int j = 1; j < x; j++)
if (x%j == 0)sum += j;
return sum;
}

求n个数中差的绝对值相差最小的2个数的差值、
#include <stdio.h>
#include<math.h>
int main()
{
int i,j,n,a[1000],min=1000;
scanf(“%d”,&n);
//两个for循环比较两数之差绝对值
for(i=0; i<n; i++)
{
scanf(“%d”,&a[i]);
for(j=0; j<i; j++)
{//绝对值函数abs(),与min比较找出最小值
if(abs(a[j]-a[i])<min)
min=abs(a[j]-a[i]);
}
}
printf(“%d”,min);
return 0;
}

求解幂集问题
#include<bits/stdc++.h>
using namespace std;
void f(int b[],int n)
{
int i;
for(i=0;i<n;i++)
if(b[i]==1)
b[i]=0;
else if(b[i]==0)
{
b[i]=1;
break;
}
}
int main()
{
int m,n,cnt,i,j,a[1000],b[1000]={0};
cin>>n;
for(i=0;i<n;i++)
a[i]=i+1;
m=1<<n;
for(i=1;i<=m;i++)
{
cnt=0;
printf(“{”);
for(j=0;j<n;j++)
if(b[j]1)
{
cnt++;
if(cnt
1)
printf(“%d”,a[j]);
else
printf(“,%d”,a[j]);
}
printf(“}\n”);
f(b,n);
}
return 0;
}

数列分段
#include<stdio.h>
int main()
{
int n;
int str[1000], i, num, count = 0;
scanf(“%d”, &n);
for (i = 0; i < n; i++)
scanf(“%d”, &str[i]);//输入数组中数字
i = 0;
while (i < n) {
num = str[i];
while(num == str[i]) {
i++;
}
count++;
}
printf(“%d”, count);
return 0;
}

相邻数对
#include<bits/stdc++.h>
#include
using namespace std;
int num[1005];
int main()
{
int n,count = 0;
cin >> n;
for(int i=0; i<n; i++)
cin >> num[i];
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
if((num[i]+1) == num[j] ||(num[i]-1) == num[j])
count++;
cout << count/2;
return 0;
}

最大子列和问题
#include<stdio.h>

int main(){
int i,a[100001],b[100001],n;
int maxsum,tempsum=0;

scanf("%d\n",&n);
for(i=0;i<n;i++){
	scanf("%d",&a[i]);
	//if(i!=n-1)scanf(" ");
}
maxsum = 0;
for(i=0;i<n;i++){
	tempsum += a[i];
    if(tempsum < 0) tempsum = 0;		//如果序列中所有整数皆为负数,则输出0
	if(tempsum > maxsum)maxsum = tempsum;
}
printf("%d",maxsum);
return 0;

}

子集和问题
#include <bits/stdc++.h>
using namespace std;
int n,res;
vector v,v1;
void dfs(int sum,int pos){
if(pos>n) return;
sum += v[pos];
if(sum>res){
return;
}
v1.push_back(v[pos]);
if(sum==res){
for(auto it=v1.begin();it!=v1.end();it++){
cout<<*it<<" ";
}
cout<<endl;
v1.pop_back();
return;
}
for (int i = pos + 1; i <= n;i++){
dfs(sum, i);
}
v1.pop_back();
}
int main(){
cin>>n>>res;
v.resize(n+1);
for(int i=1;i<=n;i++) cin>>v[i];
for(int i=1;i<=n;i++)
dfs(0, i);
}

幂集(回溯法)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,r;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
{
cin>>a[i];
}
r=pow(2,n);
cout<<r;
}

加勒比海盗船——最优装载问题
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t–)
{
int c,n;
cin>>c>>n;
vector v;
for(int i=0;i<n;i++)
{
int temp;
cin>>temp;
v.push_back(temp);
}
sort(v.begin(),v.end());
int sum=0;
int res=0;
for(int i=0;i<n;i++)
{
sum+=v[i];
if(sum<=c)
{
res++;
}
else
{
break;
}
}
cout<<res<<endl;
}
}

Swan学院社团招新
#include<bits/stdc++.h>
using namespace std;
typedef struct time
{
int start;
int end1;
}TIME;
bool cmp(TIME a,TIME b)
{
return a.start <b.start;
}
int main()
{
int n;
cin>>n;
TIME num[n];
for(int i=0;i<n;i++)
{
cin>>num[i].start>>num[i].end1;
}
sort(num,num+n,cmp);
int sum = 1;
for(int i=1;i<n;i++)
{
if(num[i].start>=num[i-1].end1)
{
sum++;
}
}
cout<<sum;
}

看电影
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int startTime;//电影开始时间
int endTime;//电影结束时间
}TIME;
int cmp(TIME *a,TIME *b)
{
return a->endTime-b->endTime;
}
int main()
{TIME a[100];
int n,i,inteval,k;//inteval为相对当前电影的前一个电影的结束时间
while(~scanf(“%d”,&n)&&n)
{inteval=0;k=0;
for(i=0;i<n;i++)
scanf(“%d%d”,&a[i].startTime,&a[i].endTime);
qsort(a,n,sizeof(TIME),cmp);
for(i=0;i<n;i++)
if(
a[i].startTime>=inteval
)
{
inteval=
a[i].endTime
;
k++;
}
printf(“%d\n”,k);
}
return 0;
}

装箱问题
#include<stdio.h>
int main()
{
int thing[1000][2] = { 0 };
int box[1000] = { 0 };
int N;
int boxNum = 0;
scanf(“%d”, &N);
for (int i = 0; i < N; i++)
{
scanf(“%d”, &thing[i][0]);
}
for (int i = 0; i < N; i++)
{
for (int k = 0; k < N; k++)
{
if (thing[i][0] + box[k] <= 100)
{
box[k] += thing[i][0];
thing[i][1] = k + 1;
if (k + 1 > boxNum)
{
boxNum = k + 1;
}
break;
}
}
}
for (int i = 0; i < N; i++)
{
printf(“%d %d\n”, thing[i][0], thing[i][1]);
}
printf(“%d”, boxNum);
return 0;
}

汽车加油问题
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, k;
int m[1000];
cin >> n >> k;
for (int i = 0; i <= k; i++) {
cin >> m[i];
}

int maxx = 0;
int i = 0;
int kkk = 0;
if (m[0] <= n) {
	maxx += m[i];
	i++;
}
else {
	cout << "No Solution!";
	return 0;
}

while (i <= k) {
	if (maxx + m[i] <= n) {
		maxx += m[i];
		i++;
		if (maxx + m[i] > n) {
			kkk++;
			maxx = 0;
		}
	}
	else {
		cout << "No Solution!";
		return 0;
	}
	
}
cout << kkk;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值