先把赛时AC的题回顾一下:
A:
STL的应用。
注意动物名字首末字符相同情况
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt;
void init(){cnt=0,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,val;}ee[M*2];
void add(int x,int y){ee[++cnt].nxt=head[x],ee[cnt].to=y,head[x]=cnt;}
*/
string a,s[M];
map<char,int>mp;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>a;
char ch=a[a.length()-1];
int n;
cin>>n;
int f=0;
for(int i=1;i<=n;i++)
{
cin>>s[i];
mp[s[i][0]]++;
}
int id=-1;
for(int i=1;i<=n;i++)
{
if(f==2)continue;
if(s[i][0]==ch)
{
if(f==0)id=i,f=1;
int l=s[i].length();
int tp=0;
mp[s[i][0]]--;
if(mp[s[i][l-1]]==0)f=2,id=i;
mp[s[i][0]]++;
}
}
if(f==0)cout<<"?"<<endl;
else if(f==1)cout<<s[id]<<endl;
else cout<<s[id]<<"!"<<endl;
return 0;
}
B:
巧妙的暴力一下即可。
先固定方向。
然后固定放置顺序即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt;
void init(){cnt=0,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,val;}ee[M*2];
void add(int x,int y){ee[++cnt].nxt=head[x],ee[cnt].to=y,head[x]=cnt;}
*/
ll a[4],b[4];
ll cal()//不能旋转
{
ll w,h;
w=a[1]+a[2]+a[3];h=max(b[1],max(b[2],b[3]));//三个块并排横着放
ll ans=w*h;
h=b[1]+b[2]+b[3];w=max(a[1],max(a[2],a[3]));//三个块并排竖着放
ans=min(ans,w*h);
w=a[1]+max(a[2],a[3]);h=max(b[1],b[2]+b[3]);//1在前面 23竖着在后面
ans=min(ans,w*h);
w=a[2]+max(a[1],a[3]);h=max(b[2],b[1]+b[3]);//2在前面 13竖着在后面
ans=min(ans,w*h);
w=a[3]+max(a[1],a[2]);h=max(b[3],b[1]+b[2]);//3在前面 12竖着在后面
ans=min(ans,w*h);
w=max(a[1],a[2]+a[3]);h=b[1]+max(b[2],b[3]);
ans=min(ans,w*h);
w=max(a[2],a[1]+a[3]);h=b[2]+max(b[1],b[3]);
ans=min(ans,w*h);
w=max(a[3],a[1]+a[2]);h=b[3]+max(b[1],b[2]);
ans=min(ans,w*h);
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
while(t--)
{
for(int i=1;i<=3;i++)cin>>a[i]>>b[i];
ll mi=4e18;
ll tp;
for(int i=0;i<8;i++)
{
for(int j=0;j<3;j++)
if(i>>j&1)swap(a[j+1],b[j+1]);
tp=cal();
mi=min(mi,tp);
for(int j=0;j<3;j++)
if(i>>j&1)swap(a[j+1],b[j+1]);
}
cout<<mi<<endl;
}
return 0;
}
C:
比较显然的思维题。
最多三刀。
先切a/m,再切一刀一竖列m。然后横着切出a%m即可。
考虑什么时候一刀:a%n==0||a%m==0
什么时候2刀先竖着一刀,再横着切一刀。三块中选2块,或一小块。暴力判下即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt;
void init(){cnt=0,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,val;}ee[M*2];
void add(int x,int y){ee[++cnt].nxt=head[x],ee[cnt].to=y,head[x]=cnt;}
*/
ll a;
bool gao(ll n,ll m)
{
for(int z=1;z<n;z++)
{
ll i=z;
ll l=i*m,r=(n-i)*m;
bool f=false;
if((a%i==0&&a/i<=m)||(a%(n-i)==0&&a/(n-i)<=m))f=true;//左小块或右小块
if(a-l>0&&(a-l)%(n-i)==0)f=true;//左大块+右小块
if(a-r>0&&(a-r)%i==0)f=true;//右大块+左小块
if(f)return true;
}
return false;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
ll n,m;
cin>>n>>m>>a;
if(a%n==0||a%m==0)
{
cout<<1<<endl;
return 0;
}
if(gao(n,m)||gao(m,n))cout<<2<<endl;
else cout<<3<<endl;
return 0;
}
D:
暴力模拟即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt;
void init(){cnt=0,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,val;}ee[M*2];
void add(int x,int y){ee[++cnt].nxt=head[x],ee[cnt].to=y,head[x]=cnt;}
*/
char s[110][110];
char t[110];
int q[110];
int main()
{
int n=0,m;
while(scanf("%s",t))
{
if(t[0]<='9'&&t[0]>='0')
{
int l=strlen(t);
m=0;
for(int i=0;i<l;i++)
m*=10,m+=t[i]-'0';
break;
}
n++;
}
// cout<<"---"<<m<<endl;
vector<int>a,b;
int sz=m;
for(int i=0;i<m;i++)
scanf("%s",s[i]),q[i]=i;
int fg=1,lst=0;
while(1)
{
if(sz==1)
{
if(fg==1)a.pb(q[0]);
else b.pb(q[0]);
break;
}
int id=(lst-1+n+sz)%sz;
// cout<<lst<<" "<<id<<" "<<sz<<endl;
if(id==sz-1)lst=0;
else lst=id;
int ct=-1;
for(int i=0;i<sz;i++)
{
if(i==id)
{
if(fg==1)a.pb(q[i]);
else b.pb(q[i]);
fg^=1;
}
else
q[++ct]=q[i];
}
--sz;
}
printf("%d\n",a.size());
for(int i=0;i<a.size();i++)printf("%s\n",s[a[i]]);
printf("%d\n",b.size());
for(int i=0;i<b.size();i++)printf("%s\n",s[b[i]]);
return 0;
}
E:
遍历找最小即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 1e5+7;
/*
int head[M],cnt;
void init(){cnt=0,memset(head,0,sizeof(head));}
struct EDGE{int to,nxt,val;}ee[M*2];
void add(int x,int y){ee[++cnt].nxt=head[x],ee[cnt].to=y,head[x]=cnt;}
*/
int a[110];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
int mi=max(a[1],a[3]);
for(int i=2;i<n;i++)
{
mi=min(mi,max(a[i-1],a[i+1]));
}
int id=-1;
for(int i=2;i<n;i++)
{
int z=max(a[i-1],a[i+1]);
if(z==mi)
{
id=i;
break;
}
}
cout<<id-1<<" "<<mi<<endl;
return 0;
}