A. Santa Claus and a Place in a Class
模拟题。(0:12)
题意:n列桌子,每列m张桌子,每张桌子一分为2,具体格式看题面描述。给出n,m及k。求编号为k的桌子在第几行第几列是左还是右。
思路:由图知k为奇数在左边。每列有2*m个数,k/(2*m)然后就可以知道在第几列。然后数据小遍历找到第几行。
int main()
{
int n,m,k;
while(~scanf("%d%d%d",&n,&m,&k))
{
char c;
if(k%2) c='L';
else c='R';
int x=0,y=0;
y=k/(2*m);
if(k%(2*m)) y++;
k-=(y-1)*2*m;
while(k>0)
{
k-=2;
x++;
}
printf("%d %d %c\n",y,x,c);
}
return 0;
}
B. Santa Claus and Keyboard Check
贪心模拟题。(0:39)
题意:真没读懂,大概知道了样例怎么来的。给出两个串,每个字符可以唯一对应(变成)另外一个字符,问如果第一个字符串可以变为另外一个串,输出对应要变的字符。
思路:就是一顿乱判,用map存对应关系,可能是样例比较水吧,侥幸过了终判。
struct node
{
char x,y;
}a1[N];
int main()
{
string a,b;
cin>>a>>b;
if(a==b)
{
printf("0\n");
}
else
{
int f=0,len=0;
int len1=a.size();
int len2=b.size();
if(len1!=len2) f=1;
map<char,char>q;
int v[50];
memset(v,0,sizeof(v));
memset(a1,'0',sizeof(a1));
for(int i=0;i<len1&&i<len2;i++)
{
if(a[i]==b[i])
{
if(v[a[i]-'a']||v[b[i]-'a']) //已经有主了;
{
if(v[a[i]-'a']&&q[a[i]]!=b[i]) f=1;
if(v[b[i]-'a']&&q[b[i]]!=a[i]) f=1;
}
else q[a[i]]=b[i];
}
else
{
if(v[a[i]-'a']||v[b[i]-'a'])
{
if(v[a[i]-'a']&&q[a[i]]!=b[i]) f=1;
else if(v[b[i]-'a']&&q[b[i]]!=a[i]) f=1;
}
else
{
q[a[i]]=b[i];
q[b[i]]=a[i];
a1[len].x=a[i];
a1[len++].y=b[i];
}
}
v[a[i]-'a']=1;
v[b[i]-'a']=1;
}
if(f) printf("-1\n");
else
{
printf("%d\n",len);
for(int i=0;i<len;i++)
printf("%c %c\n",a1[i].x,a1[i].y);
}
}
return 0;
}
侥幸过了终判,中间WA了一发。(1:41)
题意:有一个串,只包含‘U’、‘L’、'R'、‘D’四种字符,分别表示往哪个方向走。小明要走一个序列,起点为p0,每次从pi走到pi+1(1<=i<n)。小明只会沿着格子走最短路。但路线可能有很多种。求n的最小值。
思路:由最后一个图发现每次经过一个点都走了相反的路线。一去一回这这便经过了一个点。所以求有多少相反对即可。(U和D、L和R分别为一个相反对)
int main()
{
int n;
int v[50];
memset(v,0,sizeof(v));
string a;
cin>>n>>a;
int ans=0;
char c=a[0];//当前状态,表示走的方向
for(int i=0;i<n;i++)
{
if((c=='L'&&a[i]=='R')||(c=='R'&&a[i]=='L')||(c=='U'&&a[i]=='D')||(c=='D'&&a[i]=='U'))//遇到相反对
{
c=a[i];//更新当前状态
ans++;
memset(v,0,sizeof(v));
v[a[i]-'A']=1;
continue;
}
if(c=='L'||c=='R')
{
if((a[i]=='U'&&v['D'-'A'])||(a[i]=='D'&&v['U'-'A']))
{
c=a[i];
ans++;
memset(v,0,sizeof(v));
}
v[a[i]-'A']=1;
}
else
{
if((a[i]=='L'&&v['R'-'A'])||(a[i]=='R'&&v['L'-'A']))
{
c=a[i];
ans++;
memset(v,0,sizeof(v));
}
v[a[i]-'A']=1;
}
}
ans++;//终点
printf("%d\n",ans);
return 0;
}
C题刚想到这个思路的时候学姐给了一个想法:每两个点之间只有两种方向。。。但按着这种思路WA在第六组了。。。