[NEUQ] 2020训练赛1

[NEUQ] 2020训练赛1

A - Hungry Student Problem

CodeForces - 903A

思路:

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

CodeForces - 903B

思路:

模拟,能秒先秒,不能秒就打,不能打就加血,

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

CodeForces - 903C

思路:

相同的盒子出现次数最多的

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

CodeForces - 903D

思路:

前缀和,相差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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值