组队训练赛第二场
题目连接传送门
B. Boss Battle
当n≤3时显然1步就可以炸死。否则每次可以缩小一格,故答案为n−2。
#include<stdio.h>
int main()
{
int t;
scanf("%d",&t);
if(t<=3) printf("1\n");
else printf("%d\n",t-2);
}
D. Dunglish
按题意模拟(correct是可以取0的,做的时候一直把他归为另一类,WA了十几发)
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
int n;
vector<string> st;
string str[25];
set<string> ss;
map<string,int> a;
map<string,int> b;
map<string,int> c;
map<string,string> ma1;
map<string,string> ma2;
ma2.clear();
ma1.clear();
c.clear();
a.clear();
a.clear();
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
string s;
cin>>s;
if(!a.count(s)) a[s]=0;
a[s]++;
if(!ss.count(s)) {
st.push_back(s);
ss.insert(s);
}
str[i]=s;
}
int m;
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
string s1,s2,s3;
cin>>s1>>s2>>s3;
if(s3[0]=='c') {
if(!b.count(s1)) b[s1]=0;
b[s1]++;
ma2[s1]=s2;
}
if(s3[0]=='i') {
if(!c.count(s1)) c[s1]=0;
c[s1]++;
ma1[s1]=s2;
}
}
int flag=1;
unsigned long long ans1=1,ans2=1;
for(int i=0;i<st.size();i++)
{
int p,q,r;
string s=st[i];
if(!b.count(s)) p=0;
else p=b[s];
if(!c.count(s)) r=0;
else r=c[s];
q=a[s];
for(int j=1;j<=q;j++)
{
ans2=ans2*(p+r);
}
}
for(int i=0;i<st.size();i++)
{
int p,q;
string s=st[i];
if(!b.count(s)) p=0;
else p=b[s];
if(!c.count(s)) q=0;
else q=c[s];
if((p+q)>=2) flag=2;
}
for(int i=0;i<st.size();i++)
{
string s=st[i];
if(flag!=2&&!b.count(s)) flag=0;
}
for(int i=0;i<st.size();i++)
{
int p;
string s=st[i];
if(!b.count(s)) {
ans1=0;
break;
}
p=b[s];
int q=a[s];
for(int j=1;j<=q;j++)
ans1=ans1*p;
}
if(flag==0)
{
for(int i=1;i<=n;i++)
{
if(ma1.count(str[i])) cout<<ma1[str[i]];
else cout<<ma2[str[i]];
if(i!=n) printf(" ");
}
printf("\n");
printf("incorrect\n");
}
else if (flag==1) {
for(int i=1;i<=n;i++)
{
cout<<ma2[str[i]];
if(i!=n) printf(" ");
}
printf("\n");
printf("correct\n");
}
else {
cout<<ans1<<" correct"<<endl;
cout<<ans2-ans1<<" incorrect"<<endl;
}
return 0;
}
H. High Score
因为平方增长较快,所以全部给某个数是最优的,但在小数据下不一定成立,故小数据暴力枚举即可。
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int K=1000;
int T;ll a,b,c,d,i,j,k,ans;
inline ll cal(ll a,ll b,ll c){return a*a+b*b+c*c+min(a,min(b,c))*7;}
int main(){
cin>>T;
while(T--){
cin>>a>>b>>c>>d;
ans=0;
for(i=0;i<=d&&i<=K;i++)for(j=0;i+j<=d&&j<=K;j++){
k=d-i-j;
ans=max(ans,cal(a+i,b+j,c+k));
ans=max(ans,cal(a+i,b+k,c+j));
ans=max(ans,cal(a+k,b+i,c+j));
}
ans=max(ans,cal(a+d,b,c));
ans=max(ans,cal(a,b+d,c));
ans=max(ans,cal(a,b,c+d));
cout<<ans<<endl;
}
}