Educational Codeforces Round 84 (Rated for Div. 2)

個人博客:voids5.cn

A. Sum of Odd Integers

題意:兩個數n、k,判斷n是否能被產分成k個不同的素數

解題思路:首先n,k奇偶性要相同,然後根據求和公式k個奇數相加最小數爲k2,故n>=k2

Code:

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
ll t,n,k; //注意範圍

int main(){
	cin>>t;
	while(t--){
		cin>>n>>k;
		if(n%2 == k%2 && n>=k*k){
			puts("YES");
		}
		else {
			puts("NO");
		}
	}

	return 0;
}

B. Princesses and Princes

題意:有n個公主每人都有個名單,每個公主依次從名單上找到數最小並且未被選走的王子,如果最後公主有剩餘則在某個公主的名單上添加一個未被選走的王子

解題思路:對已選走的王子及剩餘的公主都進行標記,然後搭配即可

Code:

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 1e5+5,mod=998244353;
vector<int>ve[N];
int t,n,vis[N];

int main(){
	cin>>t;
	while(t--){
		cin>>n;
//		vector<int>ve[N];
		for(int i=1;i<=n;i++){
			ve[i].clear();
			int k;
			cin>>k;
			for(int j=1;j<=k;j++){
				int x;
				cin>>x;
				ve[i].push_back(x);
			}
		}
		memset(vis,0,sizeof(vis));
		int temp=-1,flag=0;
		for(int i=1;i<=n;i++){
			flag=0;
			for(int j=0;j<ve[i].size();j++){
				if(!vis[ve[i][j]]){
					flag=1;
					vis[ve[i][j]]=1;
					break;
				}
			}
			if(!flag){
				temp=i;
			}
		}
		if(temp==-1){
			cout<<"OPTIMAL"<<endl;
		}
		else {
			for(int i=1;i<=n;i++){
				if(!vis[i]){
					cout<<"IMPROVE"<<endl;
					cout<<temp<<' '<<i<<endl;
					break;
				}
			}
		}
	}

	return 0;
}

C. Game with Chips

題目鏈接:https://codeforces.com/contest/1327/problem/C

題目大意:n*m方格中有k個卡牌,每個卡牌有初始位置及需要經過一次的位置,如果能到達則給出路徑,否則輸出-1,每次移動所有卡牌都要移動,到邊界位置後卡牌不再移動

解題思路:先將卡牌一道到(1,1)位置,然後按行小優先原則依次移動,考慮最壞情況移動次數爲2*(n-1)(m-1)<2n*m;

Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=500;
int t,n,m,k;
string s;
struct node
{
	int x,y;
}eg[N];
bool cmp(node a,node b)
{
	if (a.x==b.x)
		return a.y<b.y;
	else return a.x<b.x;
}
int main()
{
	cin>>n>>m>>k;
	for(int i=1;i<m;i++) s.push_back('L');
	for(int i=1;i<n;i++) s.push_back('U');
	int x,y;
	for(int i=0;i<k;i++) cin>>x>>y;

	for(int i=1;i<=k;i++)
	{
		cin>>eg[i].x>>eg[i].y;
	}
	eg[0]={1,1};
	sort(eg,eg+k+1,cmp);
	for(int i=1;i<=k;i++)
	{
		int num1=abs(eg[i].x-eg[i-1].x);
		int num2=abs(eg[i].y-eg[i-1].y);
		if(eg[i].x>=eg[i-1].x)
		{
			for(int j=0;j<num1;j++)
				s.push_back('D');
		}
		else
		{
			for(int j=0;j<num1;j++)
				s.push_back('U');
		}
		if(eg[i].y>=eg[i-1].y)
		{
			for(int j=0;j<num2;j++)
				s.push_back('R');
		}
		else
		{
			for(int j=0;j<num2;j++)
				s.push_back('L');
		}
	}
	if(s.size()<=2*n*m){
		cout<<s.size()<<endl<<s;
	}
	else cout<<"-1"<<endl;

	return 0;
  }
 

E. Count The Blocks

鏈接:https://codeforces.com/contest/1327/problem/E

題意:求0 ~ 10^n - 1中數目爲1~n的塊數

思路:假設num爲i長度的塊 1.num位於中間,放的方法有(n-i-1)種,則num前後的數都與num不同,都有9種可能,剩下的(n-i-2)個位置都有10種可能,num本身有10種
2.num位於邊界,num前或後的數放的方法有9種,剩下的(n-i-1)都有10種可能,num本身10種可能
3.num長爲1,只有一種方法,本身10種可能

Code:


#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 100,mod=998244353;
int n;

ll ksm(ll a,ll b){
	ll res=1;
	while(b>0){ //注意b可能小於0
		if(b&1) res=res*a%mod;
		b>>=1;
		a=a*a%mod;
	}
	return res;
}

int main(){
	cin>>n;
	for(ll i=1;i<n;i++){
		ll sum=0;
		sum=(sum+(n-i-1)*9*9*10*ksm(10,n-i-2))%mod;//中間情況
		sum=(sum+2*9*ksm(10,n-i-1)*10)%mod;//邊界情況
		cout<<sum<<" ";
	}
	cout<<10<<endl;

	return 0;
}

剩下的都是有生之年系列

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章