1.Today is a bad wonderful day.
j组非常的有趣啊,it is very easy!
今天我们学了穷举及优化 and 递归、递推以及分治
(真服了那个神经评测网站了,我第一次提交那个代码,一种不知名的错误,第二次提交(一点没改 AC了,……6666666
(我终于知道分治是什么奇怪的东西了!
(这些对于wwq来说very very (此处省略n个very) easy,so he was very 无聊(看上去是这样),看来wwq实在是太有实力了
(他一定能成为二代qr)
开始正题
1.穷举及优化(没啥东西
首先简单介绍一下:穷举就是啥也不是,把所有可能的情况一一列举出来进行判断,也可以说是暴力枚举,虽然特别特别慢,但是csp中能坑一点分
(在聚龙的比赛就靠这个坑了不少分
例题:
#include<bits/stdc++.h>//01背包(穷举方案
using namespace std;
#define rep(i,l,n) for(int i=l;i<=n;i++)
int n,wk,w[25],c[25],b[25],maxn;//w表示重量,c表示价值 ,b表示穷举方案 (枚举01
int main()
{
cin>>n>>wk;
rep(i,1,n) cin>>w[i];
rep(i,1,n) cin>>c[i];
b[n]=1;
while(b[0]==0)
{
int s=0,t=0;
rep(i,1,n)
{
s+=b[i]*w[i];//总重
t+=b[i]*c[i];//总价值
if((s<=wk) && (t>maxn)) maxn=t;
}
int j=n;
while(b[j]==1) j--;
b[j]++;
rep(i,j+1,n) b[i]=0;
}
cout<<maxn<<endl;
return 0;
}
2.递归、递推、分治
it is easy (^.^)
- 1.递推:“递推法”是指求解问题时,从初始的一个或若干数据项出发,通过递推关系式逐步推进,从而得到最终结果。
- 2.递归:这种问题如果规模不大,往往就从概念和描述入手,采用子程序的递归调用来解决
- 3.分治:就是分而治之,简单来说就是把一个大问题拆成很多个小子问题,然后巴拉巴拉,一顿操作,就可以了
(而二分和三分就是典型的分治
2.比赛
1.奶牛乘法
#include<bits/stdc++.h>
using namespace std;
#define rep(i,l,n) for(int i=l;i<=n;i++)
string a,b;
long long sum;
int main()
{
cin>>a>>b;
rep(i,0,a.size()-1)
{
rep(j,0,b.size()-1)
{
sum+=(a[i]-'0')*(b[j]-'0');
}
}
cout<<sum<<endl;
return 0;
}
2.排序
特别离谱的发现,标程我测样例竟然没有答案
存一下一个错误的代码:
#include<bits/stdc++.h>
using namespace std;
char t;
inline void read(int &temp) {
while ((t<'0'|| t>'9') && t!='-') t=getchar();
temp=0;
int f=t=='-'?-1:1;
if (t=='-') t=getchar();
while (t>='0' && t<='9') {
temp=temp*10+t-'0';
t=getchar();
}
temp*=f;
}
int a[11451],n;
int main() {
// freopen("paixu.in","r",stdin);
// freopen("paixu.out","w",stdout);
n=1;
while ((t=getchar())!=EOF)
{
int sum=0;
for(;;)
{
int temp;
read(temp);
sum+=temp;
if (t=='\n') break;
}
a[n++]=sum;
//cout<<"1"<<endl;
}
sort(a+1,a+n+1);
for (int i=1;i<=n;i++) cout<<a[i]<<" ";
return 0;
}
5.扫雷游戏
#include<bits/stdc++.h>//mine
using namespace std;
int n,m,h;
int a[110][110];
char x;
int main()
{
memset(a,0,sizeof(a));
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>x;
if(x===='*') a[i][j]=1;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]====1) cout<<"*";
else
cout<<a[i+1][j+1]+a[i+1][j-1]+a[i+1][j]+a[i][j+1]+a[i][j-1]+a[i-1][j+1]+a[i-1][j]+a[i-1][j-1];
}
cout<<endl;
}
return 0;
}
统计单词数
–
#include
using namespace std;
string b,a;
int main()
{
getline(cin,a);
getline(cin,b);
for (int i=0;i<a>='a' && a[i]<='z') a[i]+='A'-'a';
for (int i=0;i<b>='a' && b[i]<='z') b[i]+='A'-'a';
a=" "+a+" ";
b=" "+b+" ";
int ans=0;
int ans1=b.find(a);//find 用来查找字串
if (ans1==-1)
{
cout<<"-1"<<endl;
return 0;
}
for (int i=0;i<b.size();i=b.find(a,i+1)) ans++;
cout<<ans-1+(b.find(a)==0)<<" "<<ans1<<endl;
return 0;
}