Codeforces Round 920 (Div. 3)

 Problem - A - Codeforces

#include
#define endl '\n'
#define int long long
using namespace std;
int x[4],y[4];
void solve() {
	for(int i=0;i<4;i++) cin>>x[i]>>y[i];
	int idx;
	for(int i=1;i<4;i++){
		if(y[i]==y[0]){
			idx=i;
			break;
		} 
	}
	vectorans;
	for(int i=1;i<4;i++){
		if(i==idx) continue;
		ans.push_back(i);
	}
	cout<>t;
	while(t--) {
		solve();
	}
	return 0;
}

Problem - B - Codeforces 

n个箱子,如果箱子里有猫,则bi=1,否则bi=0
操作:一天可以做三个操作之一:放进去一只猫,拿走一只猫,移动一只猫
问最少几天可以让全部猫在期望位置(解总是存在)

统计有几个位置是需要把猫拿掉的,有几个位置需要放进去猫,取max

#include
#define endl '\n'
#define int long long
using namespace std;
int n;
string s,t;
void solve() {
	cin>>n;
	cin>>s>>t;
	int cnt1=0,cnt2=0;
	for(int i=0;i>t;
	while(t--) {
		solve();
	}
	return 0;
}

Problem - C - Codeforces 

需要发送n条信息,分别在时刻mi
初始电量为f(0时刻)
每开机一个单位损失a,关机再打开损失b
问是否可以发送所有信息
遍历每个时刻,看一直开机划算还是先关机再开机划算,两个进行选取

#include
#define endl '\n'
#define int long long
using namespace std;
const int N=2e5+10;
int m[N];
int n,f,a,b;
void solve() {
	cin>>n>>f>>a>>b;
	for(int i=1;i<=n;i++) cin>>m[i];
	for(int i=1;i<=n;i++){
		int use=min(a*(m[i]-m[i-1]),b);
		f-=use;
		if(f<=0){
			cout<<"No"<>t;
	while(t--) {
		solve();
	}
	return 0;
}

Problem - D - Codeforces 

长度为n的数组a给定
从长度为m的数组b中选取n个整数成为数组c,使得ai-ci的绝对值之和D尽可能大
求最大的D

与顺序无关,先排个序
手玩
均从小到大排序,然后利用双指针,将大的放在左边,小的放在右边,贪错了
贪心
每次都是取当前差值最大的两个进行匹配
利用双指针

#include
#define endl '\n'
#define int long long
using namespace std;
const int N=2e5+10;
int a[N],b[N],c[N];
int n,m;
void solve() {
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++) cin>>b[i];
	sort(a+1,a+1+n);
	sort(b+1,b+1+m);
	reverse(b+1,b+1+m);
	int ans=0;
	//双指针
	int p=1,q=m;//p指向最大的,q指向最小的
	for(int i=1,j=n;i<=j;){//i指向最小的,j指向最大的
		if(abs(a[i]-b[p])>=abs(a[j]-b[q])){
			ans+=abs(a[i]-b[p]);
			i++,p++;
		}
		else{
			ans+=abs(a[j]-b[q]);
			j--,q--;
		}
	}
	cout<>t;
	while(t--) {
		solve();
	}
	return 0;
}

Problem - E - Codeforces 

参考Codeforces Round 920 (Div. 3) A - G - 知乎

首先只有两个人走到同一行才可能分出胜负,所以两个人只有一个人可能赢.

赢的方法是在同一行相遇之前让两个芯片的纵坐标相同.

所以不可能赢的那一方一定是尽量往边上跑,只需要判断相遇之前能否追上即可.

#include
#define endl '\n'
#define int long long
using namespace std;
int h,w,xa,ya,xb,yb;
void solve() {
	cin>>h>>w>>xa>>ya>>xb>>yb;
	if(xa>=xb){//如果初始在同一行或者Alice在Bob的下面,那么平局
		cout<<"Draw"<yb){//Alice在Bob的右边,且相差大于1列,Alice追,Bob跑,均往左
			if(ya-1<=(xb-xa+1)/2){//Alice走(xb-xa+1)/2步可以和Bob到同一行,只要看Alice走到左边界的步数ya-1是否小于等于走到和Bob同一行的步数
				cout<<"Alice"<yb){//Alice在右边
			xa++;
			ya=min(w,ya+1);
		}
		else{//Alice在左边
			xa++;
			ya=max(1ll,ya-1);
		}
		//此时Bob追赶Alice
		if(yb>ya){
			if(yb-1<=(xb-xa+1)/2){
				cout<<"Bob"<>t;
	while(t--) {
		solve();
	}
	return 0;
}

你可能感兴趣的:(codeforces,c++,算法)