cf round 84 div2

Educational Codeforces Round 84

赛后补题

题目点击链接就进去了

A题:
题意:输入一个数n,还有一个数k,问能不能将n拆成由k个奇数组成的数
比如 6 2;6可以拆成1 5;注意这k个奇数不能相同

思路:
易得结论1:n与k必须同奇偶性,可以简单证明一下,比如n=11;k=4;时4个奇数相加一定是偶数,它们不同奇偶性,反之也是,比如n=12;k=3;3个奇数相加一定是奇数,所以得保证,同奇偶性
结论2:k*k<=n 通过等差数列前n项和可以推出,如果超过了则不存在了,(1+(2*k-1)*k就是k平方,得小于n

代码:

#include<bits/stdc++.h>
#define sc(x) scanf("%lld",&x);
#define pf printf
#define rep(i,s,e) for(int i=s;i<=e;i++)
#define dep(i,e,s) for(int i=e;i>=s;i--)
using namespace std;
#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef long long ll;
int main()
{
	SIS;
	//加速cin/cout
	ll t,n,k;
	cin>>t;
	while(t--){
		cin>>n>>k;
		if(n%2==k%2) {
				if(k*k<=n) cout<<"YES"<<endl;
				else cout<<"NO"<<endl;
		}
		else cout<<"NO"<<endl;
	}
	return 0;
}

B

一道模拟题
题意:有n个公主,然后每个公主有其想要嫁去的国家,一个国家只能接纳一个公主,问如何添加使得嫁出去公主最多。无需添加则输出OPTIMAL,就行了。
思路:国家的王子匹配公主,如果王子没被匹配上的话,就给公主匹配上,判断有几个公主匹配上了,如果总数为n,则不用添加匹配了,如果不为n,则得添加,那个没有匹配上的公主,和没有匹配上的国家王子

代码:

#include<bits/stdc++.h>
#define sc(x) scanf("%lld",&x);
#define pf printf
#define rep(i,s,e) for(int i=s;i<=e;i++)
#define dep(i,e,s) for(int i=e;i>=s;i--)
using namespace std;
#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t,n,k,flag,x,cnt;
const int maxn=1e5+10;
int a[maxn],girl[maxn];
int main()
{
	SIS;
	//加速cin/cout
	cin>>t;
	while(t--){
		for(int i=1;i<=n;i++)
		{
			a[i]=0;
			girl[i]=0;
		}
		cnt = 0;
		cin>>n;
		rep(i,1,n){
			cin>>k;
			flag=1;
			rep(j,1,k){
				cin>>x;
				if(a[x]==0 && flag){
					a[x]=1;
					girl[i]=x;
					flag=0;
				}				
			}
			if(!flag) cnt++;
		}
		if(cnt!=n){
			int ans1=0,ans2=0;
			rep(i,1,n){
				if(!girl[i]) ans1=i;
				if(!a[i]) ans2=i;
				if(ans1 && ans2) break;
			}
			cout<<"IMPROVE"<<endl;
			cout<<ans1<<" "<<ans2<<endl;
		}
		else cout<<"OPTIMAL"<<endl;
	}
	return 0;
}

C

cf的套路真的是活啊。。。。
题意:在一个 NM 的矩阵中,给你 k 个起始点和 k 个目标点,你可以进行移动操作,每次可以让所有起始点向同一个方向移动一格,要让每个点至少走一遍它对应的目标点,总移动次数不超过 2N*M 次。

题解:走到最左上端,然后来回摆动,奇数往右跑,偶数回来,绝对不超过,2mn次数移动

代码:

#include<bits/stdc++.h>
#define sc(x) scanf("%lld",&x);
#define pf printf
#define rep(i,s,e) for(int i=s;i<=e;i++)
#define dep(i,e,s) for(int i=e;i>=s;i--)
using namespace std;
#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int main()
{
	SIS;
	//加速cin/cout
	int n,m,k;
	cin>>n>>m>>k;
	int sx,sy,ex,ey;
	rep(i,1,k) cin>>sx>>sy;
	rep(i,1,k) cin>>ex>>ey;
	cout<<m-1+n-1+m*n<<endl;
	rep(i,1,m-1) cout<<"L";
	rep(i,1,n-1) cout<<"U";
	rep(i,1,n){
		rep(j,1,m-1){
			if(i&1) cout<<"R";
			else cout<<"L";
		}
		cout<<"D";
	}
	return 0;
}

E
???OEIS???

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值