Shortest path of the king
一个棋盘,横坐标用a-h表示,纵坐标用1-8表示,给你两个坐标求最少步数并输出路径(能往8个方向移动)。
直接判断x,y坐标的差
#include <cstdio>
#include <string>
#include <queue>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cmath>
#define ll __int64
using namespace std;
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
int main()
{
char s[3],t[3];
scanf("%s%s",s,t);
int x=s[0]-'a'+1,y=s[1]-'0';
int xx=t[0]-'a'+1,yy=t[1]-'0';
int dx=xx-x,dy=yy-y;
if(dx==0)
{
printf("%d\n",abs(dy));
if(dy>0)
for(int i=0;i<dy;i++)
puts("U");
else
for(int i=0;i<-dy;i++)
puts("D");
}
else if(dy==0)
{
printf("%d\n",abs(dx));
if(dx>0)
for(int i=0;i<dx;i++)
puts("R");
else
for(int i=0;i<-dx;i++)
puts("L");
}
else if(dx>0&&dy>0)
{
printf("%d\n",max(dx,dy));
if(dx>dy)
{
for(int i=0;i<dy;i++)
puts("RU");
for(int i=0;i<dx-dy;i++)
puts("R");
}
else
{
for(int i=0;i<dx;i++)
puts("RU");
for(int i=1;i<dy-dx;i++)
puts("U");
}
}
else if(dx>0&&dy<0)
{
dy=-dy;
printf("%d\n",max(dx,dy));
if(dx>dy)
{
for(int i=0;i<dy;i++)
puts("RD");
for(int i=0;i<dx-dy;i++)
puts("R");
}
else
{
for(int i=0;i<dx;i++)
puts("RD");
for(int i=0;i<dy-dx;i++)
puts("D");
}
}
else if(dx<0&&dy>0)
{
dx=-dx;
printf("%d\n",max(dx,dy));
if(dx>dy)
{
for(int i=0;i<dy;i++)
puts("LU");
for(int i=0;i<dx-dy;i++)
puts("L");
}
else
{
for(int i=0;i<dx;i++)
puts("LU");
for(int i=0;i<dy-dx;i++)
puts("U");
}
}
else if(dx<0&&dy<0)
{
dx=-dx;dy=-dy;
printf("%d\n",max(dx,dy));
if(dx>dy)
{
for(int i=0;i<dy;i++)
puts("LD");
for(int i=0;i<dx-dy;i++)
puts("L");
}
else
{
for(int i=0;i<dx;i++)
puts("LD");
for(int i=0;i<dy-dx;i++)
puts("D");
}
}
}
Lorry
贪心,好多细节没考虑,WA了n遍....
#include <cstdio>
#include <string>
#include <queue>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#define ll __int64
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
struct node
{
int p,v;
int id;
} a[200010];
int vv[100050];
int cmp(node x,node y)
{
if(1.0*x.v/x.p!=1.0*y.v/y.p)
return 1.0*x.v/x.p>1.0*y.v/y.p;
return x.p>y.p;
}
int main()
{
int n,V;
scanf("%d%d",&n,&V);
int p1=0;
int pos=0;
int ans=0,ans1=0;
for(int i=1; i<=n; i++)
{
a[i].id=i;
scanf("%d%d",&a[i].p,&a[i].v);
ans+=a[i].p;
ans1+=a[i].v;
if(a[i].p==1)
p1++;
}
if(ans<V)
{
printf("%d\n",ans1);
printf("1");
for(int i=2;i<=n;i++)
printf(" %d",i);
puts("");
return 0;
}
sort(a+1,a+n+1,cmp);
int sum=0,cnt=1;
int flag=-1;
while(1)
{
if(V==1||V==0)
break;
if(p1==1&&V%2==0&&a[cnt].p==1)
{
flag=cnt;
p1--;
cnt++;
continue;
}
if(a[cnt].p==1)
p1--;
V-=a[cnt].p;
sum+=a[cnt].v;
vv[++pos]=a[cnt].id;
cnt++;
if(V==2&&flag!=-1)
{
flag=-1;
if(cnt>n)
{
V-=a[flag].p;
sum+=a[flag].v;
vv[++pos]=a[flag].id;
}
else
{
if(a[cnt].v>a[flag].v)
{
V-=a[cnt].p;
sum+=a[cnt].v;
vv[++pos]=a[cnt].id;
}
else
{
V-=a[flag].p;
sum+=a[flag].v;
vv[++pos]=a[flag].id;
}
}
}
if(cnt>n)
break;
}
if(V==1)
{
while(a[cnt].p!=1)
{
cnt++;
if(cnt==n+1)
break;
}
if(cnt<=n)
{
V-=a[cnt].p;
sum+=a[cnt].v;
vv[++pos]=a[cnt].id;
}
}
if(flag!=-1&&V>=1)
{
V-=a[flag].p;
sum+=a[flag].v;
vv[++pos]=a[flag].id;
}
printf("%d\n",sum);
if(pos!=0) printf("%d",vv[1]);
for(int i=2;i<=pos;i++)
printf(" %d",vv[i]);
puts("");
}
Tic-tac-toe
让你判断棋盘的状态,X先手,然后输出6种状态
first, second, illegal, the
first player won, the
second player won or draw
水题
#include <cstdio>
#include <string>
#include <queue>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#define ll __int64
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int xcnt;
int ocnt;
char ma[3][3];
int win(char c)
{
for(int i=0;i<3;i++)
{
if(ma[i][0]==c&&ma[i][1]==c&&ma[i][2]==c) return 1;
if(ma[0][i]==c&&ma[1][i]==c&&ma[2][i]==c) return 1;
}
if(ma[1][1]!=c) return 0;
if(ma[0][0]==c&&ma[2][2]==c) return 1;
if(ma[0][2]==c&&ma[2][0]==c) return 1;
return 0;
}
int legal()
{
if (xcnt - ocnt > 1) return 0;
if (xcnt - ocnt < 0) return 0;
if (win('X') && xcnt == ocnt) return 0;
if (win('0') && xcnt - ocnt == 1) return 0;
return 1;
}
int main()
{
xcnt=0;
ocnt=0;
for(int i=0;i<3;i++)
{
scanf("%s",ma[i]);
for(int j=0;j<3;j++)
{
xcnt+=(ma[i][j]=='X');
ocnt+=(ma[i][j]=='0');
}
}
if(!legal())
printf("illegal\n");
else if(win('X'))
printf("the first player won\n");
else if(win('0'))
printf("the second player won\n");
else if(xcnt+ocnt==9)
printf("draw\n");
else if(xcnt==ocnt)
printf("first\n");
else if(xcnt-ocnt==1)
printf("second\n");
}
Least Cost Bracket Sequence
直接贪心,想到了比较简单,cstring头文件没写CE4发..
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
char s[50005];
int a[50005],b[50005];
struct cmp
{
bool operator()(int x,int y)
{
return a[x]-b[x]>a[y]-b[y];
}
};
int main()
{
scanf("%s",s);
int len=strlen(s);
if(len&1)
{
puts("-1");return 0;
}
int i=0;
while(i<len)
{
if(s[i]=='?')
scanf("%d%d",&a[i],&b[i]);
i++;
}
priority_queue<int,vector<int>,cmp> q;
int pos=0;
ll cost=0;
for(int i=0;i<len;i++)
{
if(s[i]=='(')
pos++;
else if(s[i]==')')
pos--;
else
{
s[i]=')';
pos--;
cost+=b[i];
q.push(i);
}
if(pos<0)
{
if(q.empty()) break;
int cur=q.top();
q.pop();
s[cur]='(';
cost+=a[cur]-b[cur];
pos+=2;
}
}
if(pos==0) {printf("%lld\n",cost); puts(s);}
else puts("-1");
}