CF解题报告:3

T1 Shortest path of the king

题目

先判左右移动·,再判前后移动即可

#include <bits/stdc++.h>
using namespace std;
string s,t,ss[1563];
int ans;
int main() {
    cin>>s>>t;
    while(s!=t){
        ans++;
        if(s[0]!=t[0]) {
            ss[ans]+=s[0]<t[0]?"R":"L";
            s[0]=s[0]<t[0]?s[0]+1:s[0]-1;
        }
        if(s[1]!=t[1]){
            ss[ans]+=s[1]>t[1]?"D":"U";
            s[1]=s[1]>t[1]?s[1]-1:s[1]+1;
        }
    }
    printf("%d\n",ans);
    for(int i=1;i<=ans;i++)
        cout<<ss[i]<<endl;
}

T2 Lorry

题目

注意 t i = 1 或 2 t_i=1或2 ti=12,依此可以将所有物品按 t t t值分为两类,枚举 t i = 1 t_i=1 ti=1的物品的数量,
再贪心选取价值 p i p_i pi高的,预处理前缀和就行,时间复杂度 O ( n ) O(n) O(n)

#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
const int N=2e5+7;
int n,v,c1,c2,pos;
ll ans;
struct st{
	ll val;
	int id;
	bool operator < (const st &x) const { return val>x.val;}
}a[N],b[N];
int main(){
	scanf("%d%d",&n,&v);
	for(int i=1,t;i<=n;i++){
		ll p;
		scanf("%d%lld",&t,&p);
		if(t==1) a[++c1].val=p,a[c1].id=i;
		else b[++c2].val=p,b[c2].id=i;
	}
	sort(a+1,a+1+c1),sort(b+1,b+1+c2);
	for(int i=1;i<=c1;i++) a[i].val+=a[i-1].val;
	for(int i=1;i<=c2;i++) b[i].val+=b[i-1].val;
	for(int i=0;i<=c1 && i<=v;i++) {
		if(ans<a[i].val+b[max(0,min((v-i)>>1,c2))].val){
			ans=a[i].val+b[max(0,min((v-i)>>1,c2))].val;
			pos=i;
		}
	}
	printf("%lld\n",ans);
	for(int i=1;i<=pos;i++)
		printf("%d ",a[i].id);
	for(int i=1;i<=min(c2,(v-pos)>>1);i++)
		printf("%d ",b[i].id);
}

T3 Tic-tac-toe

题目

i l l e g a l 的情况很多,注意多画图 illegal的情况很多,注意多画图 illegal的情况很多,注意多画图
比如如下的:
1. X 与 O 的数量不对 1.X与O的数量不对 1.XO的数量不对
X-O>1
O>X
2. 两人同时获胜 2.两人同时获胜 2.两人同时获胜
在这里插入图片描述
3. 在不是自己的回合获胜 3.在不是自己的回合获胜 3.在不是自己的回合获胜
在这里插入图片描述
然后就没大问题了

#include<bits/stdc++.h>
using namespace std;
typedef double db;
typedef long long ll;
const int N=2e5+7;
char s[3][3];
bool f1;
int c1,c2;
int check(char x){
	int res=0;
	for(int i=0;i<3;i++){
		if(s[i][0]==x && s[i][1]==x && s[i][2]==x) res++;
		if(s[0][i]==x && s[1][i]==x && s[2][i]==x) res++;
	}
	if(s[0][0]==x && s[1][1]==x && s[2][2]==x) res++;
	if(s[2][0]==x && s[1][1]==x && s[0][2]==x) res++;
	return res;
}
int main(){
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			cin>>s[i][j];
			if(s[i][j]=='.') f1=1;
			else if(s[i][j]=='X') c1++;
			else c2++;
		}
	}
	int f2=check('X'),f3=check('0');
	if(c1<c2 || c1-c2>1 || (f2&&f3) || (f3 && c1>c2) || (f2 && c1==c2)) puts("illegal");
	else if(f2) puts("the first player won");
	else if(f3) puts("the second player won");
	else if(!f1) puts("draw");
	else if(c1==c2) puts("first");
	else puts("second");
}

T4 Least Cost Bracket Sequence

题目

首先,应保证序列合法:
将所有?看作 ),从左往右扫,当)的数量大于( 时,将当前位置前面任意一个原为?的位置改为( 即可
其次,由于要求花费最小,我们便贪心的选取 a i − b i a_i-b_i aibi最小的位置即可,用 优先队列维护 a i − b i 优先队列维护a_i-b_i 优先队列维护aibi即可
时间复杂度 O ( ∣ s ∣ l o g ∣ ? ∣ ) O(|s| log|?|) O(slog?)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Data {     
    int val;    
    char *p;     
    bool operator <(const Data &b)const {     return val>b.val; }
}t;
priority_queue<Data> q;     
char s[50007];
int main() {
    int mark=0;      
    ll ans=0;
    scanf("%s",s);
    for(int i=0,a,b;s[i]&&ans!=-1;++i) {
        if(s[i]=='(')  ++mark;
        else {
            --mark;  
            if(s[i]=='?') {
                scanf("%d%d",&a,&b);
                t.val=a-b,t.p=s+i;    
                q.push(t);  
                s[i]=')';
                ans+=b;
            }
        }
        if(mark<0) {       
            if(q.empty()) ans=-1;      
            if(ans!=-1) {
                mark+=2;
                t=q.top(); q.pop();
                *t.p='(';
                ans+=t.val;
            }
        }
    }
    if(mark) ans=-1;
    printf("%lld",ans);    
    if(ans!=-1) printf("\n%s",s);
}

TXL

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值