#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;
}