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=1或2,依此可以将所有物品按
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.X与O的数量不对
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
ai−bi最小的位置即可,用
优先队列维护
a
i
−
b
i
优先队列维护a_i-b_i
优先队列维护ai−bi即可
时间复杂度
O
(
∣
s
∣
l
o
g
∣
?
∣
)
O(|s| log|?|)
O(∣s∣log∣?∣)
#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