放个寒假,赶脚自己成SB了,代码写得越来越冗长,越来越水了
呃,简单的DFS,尼玛,我没当DFS做,感觉好SB
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define min(a,b) (a<b?a:b)
#define abs(a) (a>0?a:(-a))
int main()
{
char str1[10],str2[10];
gets(str1);
gets(str2);
int a0=str2[0]-'a';
int a1=str1[0]-'a';
int b0=str2[1]-'0';
int b1=str1[1]-'0';
a0-=a1;
b0-=b1;
int ans;
ans=max(abs(a0),abs(b0));
printf("%d\n",ans);
for(int i=1;i<=ans;i++)
{
if(a0!=0&&b0!=0)
{
if(a0>0&&b0<0)
{
printf("RD\n");
a0--;
b0++;
}
else if(a0>0&&b0>0)
{
printf("RU\n");
a0--;
b0--;
}
else if(a0<0&&b0<0)
{
printf("LD\n");
a0++;
b0++;
}
else
{
printf("LU\n");
a0++;
b0--;
}
}
else if(a0==0&&b0==0)
{
break;
}
else
{
if(a0==0)
{
if(b0>0)
{
printf("U\n");
b0--;
}
else if(b0<0)
{
printf("D\n");
b0++;
}
else
break;
}
else if(b0==0)
{
if(a0>0)
{
printf("R\n");
a0--;
}
else if(a0<0)
{
printf("L\n");
a0++;
}
else
break;
}
}
}
return 0;
}
B: Lorry
//之前打算用特殊排序,先把type全为2的先取,然后再多退少补
//若总type为奇数,即舍去一个2换一个1,然后第三组数据发现不行
//当两个1的某个值很大,大到和起来远远超过一个type为2的...问题出来了
//换另外一种思路,还是WA
//然后 还是这样老老实实的分析...
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
using namespace std;
struct bag
{
int type;
int capacity;
int id;
};
int vis[100001];
bag b[100001];
bool cmp(bag x,bag y)
{
return x.capacity*1.0/x.type>y.capacity*1.0/y.type;
}
int main()
{
memset(vis,0,sizeof(vis));
int n,v;
scanf("%d%d",&n,&v);
for(int i=1;i<=n;i++)
{
b[i].id=i;
scanf("%d %d",&b[i].type,&b[i].capacity);
}
sort(b+1,b+n+1,cmp);
int sum=0,ans=0;
int mx=-1,mi=-1,mx_id,mi_id;
int cnt=0;
for(int i=1;i<=n;i++)
{
int tag=1;
vis[b[i].id]=1;
sum+=b[i].type;
ans+=b[i].capacity;
if(sum>v)
{
tag=0;
vis[b[i].id]=0;
sum-=b[i].type;
ans-=b[i].capacity;
if(cnt==0)
{
if(b[i].type==2)
{
cnt=1;
mx=b[i].capacity;
mx_id=b[i].id;
}
}
}
if(tag)
{
if(b[i].type==1)
{
mi=b[i].capacity;
mi_id=b[i].id;
}
}
}
if(sum==v||mi==-1||mx==-1)
{
printf("%d\n",ans);
int total=-1;
for(int i=1;i<=n;i++)
{
if(vis[i])
total++;
}
for(int i=1;i<=n;i++)
{
if(vis[i])
{
if(total--)
printf("%d ",i);
else
printf("%d\n",i);
}
}
}
else
{
printf("%d\n",ans-mi+mx);
vis[mi_id]=0;
vis[mx_id]=1;
int total=-1;
for(int i=0;i<=n;i++)
{
if(vis[i])
total++;
}
for(int i=0;i<=n;i++)
{
if(vis[i])
{
if(total--)
printf("%d ",i);
else
printf("%d\n",i);
}
}
}
return 0;
}
C: Tic-tac-toe
这个题做的让人感觉自己智商不行了似的,WA了好多次,做完之后看别人的代码,发现自己的好长,好SB
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
string s[4];
int tag=0;
int is_ok()
{
for(int i=1;i<=3;i++)
if(s[i][1]==s[i][2]&&s[i][2]==s[i][0])
{
if(s[i][1]=='0')
{
tag+=3;
}
if(s[i][1]=='X')
{
tag+=1;
}
}
for(int i=0;i<=2;i++)
if(s[1][i]==s[2][i]&&s[1][i]==s[3][i])
{
if(s[1][i]=='X')
{
tag+=1;
}
if(s[1][i]=='0')
{
tag+=3;
}
}
if(s[1][0]==s[2][1]&&s[2][1]==s[3][2])
{
if(s[1][0]=='0')
{
tag+=3;
}
if(s[1][0]=='X')
{
tag+=1;
}
}
if(s[1][2]==s[2][1]&&s[2][1]==s[3][0])
{
if(s[1][2]=='0')
{
tag+=3;
}
if(s[1][2]=='X')
{
tag+=1;
}
}
return tag;
}
int main()
{
for(int i=1;i<=3;i++)
cin>>s[i];
int n_x=0,n_0=0,n_dot=0;
for(int i=1;i<=3;i++)
for(int j=0;j<=2;j++)
{
if(s[i][j]=='X')
n_x++;
if(s[i][j]=='0')
n_0++;
if(s[i][j]=='.')
n_dot++;
}
//printf("%d %d %d\n",n_x,n_0,n_dot);
if(n_x>=6||n_0>=6||fabs(n_x-n_0)>=2||(n_x<n_0))
{
printf("illegal\n");
return 0;
}
if(is_ok())
{
if(tag>=4)
printf("illegal\n");
if(tag==1)
{
if(n_x>n_0)
printf("the first player won\n");
else
printf("illegal\n");
}
if(tag==2)
{
if(n_x>n_0)
printf("the first player won\n");
else
printf("illegal\n");
}
if(tag==3)
{
if(n_x>n_0)
printf("illegal\n");
else
printf("the second player won\n");
}
return 0;
}
//printf("....%d\n",tag);
if(n_0+n_x==9)
{
printf("draw\n");
return 0;
}
if(n_0==n_x)
printf("first\n");
if(n_0<n_x)
printf("second\n");
return 0;
}
D: Least cost bracket sequence
简单的了解了一下set里面的pair,其实感觉好像vector
// 看别人代码过的
// 思路就是从左往右,遇到?变成),如果加了)后发现右括号比左括号多
// 就将花费小的括号变成(,中间有用到set里面的pair表示不会用,勉强看得懂
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <map>
using namespace std;
typedef pair<int ,int>ii;
priority_queue<ii>q;
char str[50010];
int len,l,r,x,y;
long long ans;
int main()
{
scanf("%s",str);
len=strlen(str);
ans=0;
l=r=0;
for(int i=0;i<len;i++)
{
if(str[i]=='(')
l++;
if(str[i]==')')
r++;
if(str[i]=='?')
{
scanf("%d%d",&x,&y);
ans+=y;
str[i]=')';
q.push(ii(y-x,i));
r++;
}
if(r>l)
{
if(!q.empty())
{
ans-=q.top().first;
l++;
r--;
str[q.top().second]='(';
q.pop();
}
else
break;
}
}
if(l!=r)
printf("-1\n");
else
{
printf("%I64d\n",ans);
printf("%s",str);
}
return 0;
}