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;
}