A. Suits(枚举,老套路了)
题意:
有四种商品,分别有a,b,c,d个。
现在有两种选择。
- 选a和d,盈利是e。
- 选b,c和d,盈利是f
问:
怎样分配商品可以赚最多。
思路:
枚举(老套路了),
这里有一个进阶版
其实这种套路是一种枚举的思路。
AC(强烈推荐学习
枚举,老套路了)
#include <iostream>
using namespace std;
int main()
{
int a,b,c,d,e,f;
cin>>a>>b>>c>>d>>e>>f;
int ans=0;
for(int num1=0; num1<=min(a,d); num1++){
int tmp=num1*e;
int num2=min(d-num1,min(b,c));
tmp+=num2*f;
ans=max(tmp,ans);
}
cout<<ans<<endl;
return 0;
}
AC(暴力if,枚举外做法,不推荐,容易错
)
#include <iostream>
using namespace std;
int main()
{
int a[7];
for(int i=1; i<=6; i++)cin>>a[i];
int ans=0,num;
if(a[5]>a[6]){
num=min(a[1],a[4]);
a[4]-=num;
a[1]-=num;
ans+=num*a[5];
}
if(a[4]){
num=min(a[2],min(a[3],a[4]));
a[4]-=num;
ans+=a[6]*num;
}
if(a[4]){
num=min(a[1],a[4]);
a[4]-=num;
a[1]-=num;
ans+=num*a[5];
}
cout<<ans<<endl;
return 0;
}
B. Blocks(又是暴力)
题意:
有黑白块块,问你是否可以经过操作,使得所有块的颜色相同。
每次可以选择改变两个相邻块的颜色。
思路:
暴力。枚举改变哪种颜色。
之后直接改变就行了
AC(赛后)
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
string s;
int n;cin>>n;
cin>>s;
for(auto &c:s)c=(c=='B')?1:0;
for(int col=0; col<2; col++){//枚举全变为1,还是变为0.
string t=s;
vector<int>ans;
for(int i=0; i+1<n; i++){
if(t[i]!=col){
t[i]=col;
t[i+1]^=1;
ans.push_back(i);
}
}
if(t.back()==col){
cout<<ans.size()<<endl;
for(auto x:ans)cout<<x+1<<' ';
return 0;
}
}
cout<<-1<<endl;
return 0;
}
AC(赛中,思路一样,不过很多废话)
#include <iostream>
#include <vector>
using namespace std;
char s[300];
int a[300],n;
vector<int>ans;
bool check1(){
int cnt=0;
for(int i=1; i<=n; i++)if(a[i]==1)cnt++;
return cnt==n;
}
bool check2(){
int cnt=0;
for(int i=1; i<=n; i++)if(a[i]==0)cnt++;
return cnt==n;
}
void work(int op){
int cnt=0;
while(1){
if(op){
if(check1())break;
}else {
if(check2())break;
}
for(int i=1; i<=n; i++){
if(a[i]!=op){
if(a[i+1]!=a[i])swap(a[i],a[i+1]);
else a[i]=a[i+1]=op;
ans.push_back(i);
break;
}
}
cnt++;
}
cout<<cnt<<endl;
for(int i=0; i<ans.size(); i++)cout<<ans[i]<<' ';
cout<<endl;
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
cin>>(s+1);
for(int i=1; i<=n; i++)a[i]=(s[i]=='B')?1:0;
int cnt1=0,cnt0=0;
for(int i=1; i<=n; i++){
if(a[i])cnt1++;
else cnt0++;
}
if(cnt1==0||cnt0==0){
cout<<0<<endl;
}else if(n%2==0&& (cnt1&1) ){
cout<<-1<<endl;
}else {
if(cnt1%2==0)work(0);
else work(1);
}
return 0;
}
C. Shawarma Tent(枚举)
题意:
在二维空间内,有很多个点,有一个点是学校。
学生会从学校回家,且都会走笛卡尔最短路。
问:
设置一个店Shawarma,使得有最多的学生放学可以经过。
思路:
可以先看学校。
那么可能的点只有四个。枚举哪种情况最优即可。
(sx+1,sy)(sx-1,sy)(sx,sy+1)(sx,sy-1)
AC
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=2e5+10;
struct point{
int x,y;
}p[maxn];
int getdis(int x1, int y1,int x2,int y2){
return abs(x1-x2)+abs(y1-y2);
}
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int n;cin>>n;
int sx,sy;
cin>>sx>>sy;
for(int i=1; i<=n; i++)cin>>p[i].x>>p[i].y;
int ans=0,ansx,ansy;
for(int i=0; i<4; i++){
int tx=sx+dx[i],ty=sy+dy[i];
int cnt=0;
for(int i=1; i<=n; i++){
if(getdis(tx,ty,p[i].x,p[i].y)+1==getdis(sx,sy,p[i].x,p[i].y))cnt++;
}
if(cnt>ans){
ans=cnt;ansx=tx;ansy=ty;
}
}
cout<<ans<<endl;
cout<<ansx<<' '<<ansy<<endl;
return 0;
}