寒假做题报告

#include<iostream>
using namespace std;int main()
{	int n,sum=0,count=0;
	for(int i=1;i<=12;i++)
	{	
		sum+=300;
		cin>>n;
		if((sum-n)/100)
			{	count+=(sum-n)/100;
			}
			sum=(sum-n)%100;
			if(sum<0)//这种用i的那么一定要放在最后判断否则会多一个
	{	cout<<"-"<<i<<endl;
		return 0;
	}

			
	}
	sum+=120*count;
	cout<<sum<<endl;
	return 0;
}
 
快速排序
#include<iostream>
#include<ctime>
using namespace std;
const int maxn=50000;
int l[maxn],r[maxn];
const int inf=1e9+7;
int a[maxn];//难道是这个。。
int partition(int a[],int l,int r)
{
int flag=a[r];//可以取得到的
int j=l-1;
for(int i=l;i<r;i++)
	if(a[i]<=flag)
	{
		j++;
		swap(a[j],a[i]);	
	}
	swap(a[j+1],a[r]);
	return j+1;
}
void quicksort(int a[],int l,int r)
{
	if(l>=r)
		return ;
	else
		if(l<r)
		{	
			int k=partition(a,l,r);
				quicksort(a,l,k-1);
				quicksort(a,k+1,r);
				
		}
}
int main()
{	int a[maxn];//难道是这个。。
	srand(time(NULL));
	for(int i=0;i<10;i++)
		{
			a[i]=rand()%100;
			cout<<a[i]<<" ";
			if(i%10==0&&i)
			cout<<endl;
		}
//int k=	partition(a,0,9);//下标最后一个
	quicksort(a,0,9);
	cout<<endl;
	for(int i=0;i<10;i++)
		{	
			cout<<a[i]<<" ";
		}

}
求幂函数
#include<iostream>
using namespace std;
long long int pow_1(long long int a,long long int b)
{	unsigned long long int sum=1;
   while(b>0){if(b&1)sum=sum%1000*a%1000;a=a%1000*a%1000;b>>=1;}return sum;}int main(){ long long int a,b;cin>>a>>b;cout<<pow_1(a,b)<<endl;return 0;}
 
金币问题(数学问题计算机化)
#include<iostream>
using namespace std;
int a[10002];
	int main()//注意空格
{	int sum=0;
	for(int i=1;sum<=10000;i++)//注意很多数学问题我要交给计算机解决他的优势就是可以巨大的计算次数关键是给出线性区域
		{
			sum+=i;
			for(int j=0;j<i;j++)
			a[sum-j]=i;
		}
	sum=0;
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
		sum+=a[i];
	cout<<sum<<endl;
	return 0;

}

DP问题

#include<iostream>
#include<cmath>
#include<math.h>
#include<cstring>
using namespace std;
const int maxn=1e5+1;
bool f[maxn];
int main()
{	
	int v,n;
	cin>>v>>n;
	int *temp=new int [n+1];
	int *a=new int [n+1];
	f[0]=1;
	for(int i=1;i<=n;i++)
	{
		cin>>temp[i];
		cin>>a[i];
			
	}
	int sum=0;
	for(int i=1;i<=n;i++)
		sum+=temp[i];
	int *k=new int [sum+1];
	int count=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<temp[i];j++)
			k[count+j]=a[i];
		count+=temp[i];//隔位数组问题
	}
	for(int i=1;i<=sum;i++)
	{	for(int j=v;j>=k[i];j--)
		if(f[j]==0)
			f[j]=f[j-k[i]];
		
	}
	int x=v;
	while(f[x]==0)x--;//有毒。。。。
	cout<<x<<endl;
	return 0;
}

快速排序

#include<iostream>
#include<ctime>
using namespace std;
int n,a[100];
void quicksort(int left,int right)
{
	if(left>right)
		return ;
	int k=a[left];//其实是任意选择的
	int i=left,j=right;
	while(i!=j)//注意这样很容易死循环,i<j的话不一定会出来i=j
	{
		while(a[j]>=k&&i<j)//想要知道出来是个什么玩意你就别用j--赋值
			j--;
		while(a[i]<=k&&i<j)//这个等于有点用。。否则永远在第一个。。,而且后面也有用。关键
			i++;
		if(i<j)//这个似乎是不必要的
		{
		int temp=a[i];
		a[i]=a[j];
		a[j]=temp;
		}
		}
	a[left]=a[i];
	a[i]=k;
	quicksort(left,i-1);//注意写的函数符合一定的事实更好使用
	quicksort(i+1,right);
	return ;
}//这个左右是指有值的左右,
int main()
{	srand(time(NULL));
	while(cin>>n)
	{
	for(int i=1;i<=n;i++)
	{		a[i]=rand()%100;
			cout<<a[i]<<" ";
	}
	quicksort(1,n);
	cout<<endl;
	for(int i=1;i<=n;i++)
		cout<<a[i]<<" ";
	system("pause");
	}




}

双算法对撞

//list,目前是有序输入,未排序问题怎么办,dfs练习
#include<iostream>
#include<algorithm>
using namespace std;
int a[11];
int book[11];
int n;
void dfs(int step)
{
	if(step==n+1)//n+1才对第n个盒子也要放
		{
			for(int i=1;i<=n;i++)
			cout<<a[i]<<" ";
			cout<<endl;
			return ;//非常重要
		}
	else
	{	
		for(int i=1;i<=n;i++)
			if(book[i]==0&&step<=n)
		{
			a[step]=i;
			book[i]=1;
			dfs(step+1);
			book[i]=0;//回收
		}


	}
	return ;
}
void permutation()
{	
	for(int i=0;i<n;i++)
			a[i]=i+1;
	do
	{
		for(int i=0;i<n;i++)
		cout<<a[i]<<" ";

		cout<<endl;
	
	}while(next_permutation(a,a+n));//这个只能这么用?
}
int main()
{
	cin>>n;
	dfs(1);
	cout<<endl;
	permutation();
	return 0;
}

任意不定等式

//list,目前是有序输入,未排序问题怎么办,dfs练习
#include<iostream>
#include<algorithm>
using namespace std;
int a[11];
int book[11];
int n;
int total;
void dfs(int step)
{
	if(step==10&&(a[1]*100+a[2]*10+a[3]+a[4]*100+a[5]*10+a[6])==(a[7]*100+a[8]*10+a[9]))//n+1才对第n个盒子也要放
		{
			
				cout<<a[1]<<a[2]<<a[3]<<"+"<<a[4]<<a[5]<<a[6]<<"="<<a[7]<<a[8]<<a[9]<<endl;
				//非常重要
				total++;
			return ;
		}
		
		for(int i=1;i<=9;i++)
			if(book[i]==0&&step<=9)
		{
			a[step]=i;
			book[i]=1;
			dfs(step+1);
			book[i]=0;//回收
		}


	
	return ;
}

int main()
{
	
	dfs(1);
	cout<<endl;
	cout<<total/2<<endl;
	return 0;
}




                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值