[NEUQ] 2020训练赛1
A - Hungry Student Problem
思路:
3a+7b=x求整数解
AC代码:
//代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,x;
cin>>n;
while(n--)
{
int bj=0;
cin>>x;
for(int a=0;a<=x/3;a++)
{
if((x-3*a)%7==0){bj=1;break;}
}
if(bj==1)puts("YES");
else puts("NO");
}
return 0;
}
B - The Modcrab
思路:
模拟,能秒先秒,不能秒就打,不能打就加血,
AC代码:
//代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int h1,a1,c1,h2,a2;
vector <int>fuck;
cin>>h1>>a1>>c1;
cin>>h2>>a2;
while(h2>0)
{
if(h1>a2||h2<=a1)
{
h1-=a2;
h2-=a1;
fuck.push_back(1);//attack
}
else
{
h1+=c1-a2;
fuck.push_back(0);//heal
}
}
cout<<fuck.size()<<endl;
for(int i=0;i<fuck.size();i++)
{
if(fuck[i]==1)puts("STRIKE");
else puts("HEAL");
}
return 0;
}
C - Boxes Packing
思路:
相同的盒子出现次数最多的
e.g假设a<b<c<d
a a
b b b b
c
d d d
垂直下落 = > d d d b
AC代码:
//代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a,ans=1;
map<int,int>mp;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a;
mp[a]++;
ans=max(ans,mp[a]);
}
cout<<ans<<endl;
return 0;
}
D - Almost Difference
思路:
前缀和,相差1的减(加)回去
AC代码:
//代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 2e5 + 7, maxd = 1e8;
const ll mod = 1e9 + 7;
const int INF = 0x7fffffff;
int n;
ll sum[maxn];
map<ll , int> mp;
int main()
{
cin >> n;
long double ans = 0;
for(int i = 1; i <= n;i++)
{
ll x;
cin>>x;
ans += ( (long double)(x*(i-1)) - (long double)(sum[i-1]) );
if(mp[x-1]) ans-=(long double)(mp[x-1]);
if(mp[x+1]) ans+=(long double)(mp[x+1]);
sum[i]=sum[i-1]+x;
mp[x]++;
}
cout<<fixed<<setprecision(0)<<ans<<endl;
return 0;
}
E
思路:
枚举第一个字符串交换两个位置假设为原串,和剩下的k-1串比较如果能由这个原串得到,就是答案
单纯比较会超时,先求出其他串与第一个串的diffrent再变形
AC代码:
//代码
#include<bits/stdc++.h>
using namespace std;
int k,n,num1[26],num2[26],dif[2505],repeat=0;
string s[2505],ss;
int main()
{
cin>>k>>n;
for(int i=1;i<=k;i++)cin>>s[i];
for(int i=0;i<n;i++)
if(++num1[s[1][i]-'a']>1)repeat=1;
for(int i=2;i<=k;i++)
{
memset(num2,0,sizeof(num2));
for(int j=0;j<n;j++)num2[s[k][j]-'a']++;
for(int j=0;j<26;j++)if(num1[j]!=num2[j])return 0*printf("-1");
}
for(int i=2;i<=k;i++)
for(int j=0;j<n;j++)
if(s[1][j]!=s[i][j])dif[i]++;
for(int p=0;p<n;p++)
for(int q=p+1;q<n;q++)
{
int flag=0;
for(int i=2;i<=k;i++)
{
int cnt=dif[i];
if(s[1][p]==s[i][p])cnt++;
if(s[1][q]==s[i][q])cnt++;
if(s[1][p]==s[i][q])cnt--;
if(s[1][q]==s[i][p])cnt--;
if(cnt==2||cnt==0&&repeat)continue;
else {flag=1;break;}
}
if(flag==0)
{
ss=s[1];
swap(ss[p],ss[q]);
cout<<ss<<endl;
return 0;
}
}
cout<<-1<<endl;
return 0;
}