第二节没有什么难想的题,关于进制转换这块我不是很熟练(其实X进制跟10进制都一样),得补习一下。
Milking Cows (milk2)
区间问题,看数据用int似乎也应该能过。注意一点区间左右都是闭的,也就是说a在t时刻结束,b在t时刻开始,那么a和b属于连续的情况。
/*
ID:kkkwjx1
LANG:C++
TASK:milk2
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define Max(a,b) (a>b)?a:b
using namespace std;
struct Elem
{
int l,r;
};
bool cmp(Elem a,Elem b)
{
if(a.l==b.l) return a.r<b.r;
return a.l<b.l;
}
Elem p[5005];
int main()
{
freopen("milk2.in","r",stdin);
freopen("milk2.out","w",stdout);
int n;
scanf("%d",&n);
for(int i=0; i<n; ++i)
scanf("%d%d",&p[i].l,&p[i].r);
sort(p,p+n,cmp);
int st=p[0].l,ed=p[0].r;
long long ans1=ed-st,ans2=0;
for(int i=1; i<n; ++i)
{
if(ed<p[i].l)
{
ans2=Max(ans2,p[i].l-ed);
st=p[i].l;
ed=p[i].r;
}
else
{
if(ed<=p[i].r)
ed=p[i].r;
}
ans1=Max(ans1,ed-st);
}
printf("%lld %lld\n",ans1,ans2);
return 0;
}
Transformations (transform)
注意一点,1,2,3……这几种操作分别是有优先级的。
例如
2
@@
@@
@@
@@
这种情况应该输出1,而不是6.
/*
ID:kkkwjx1
LANG:C++
TASK:transform
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#define INF 0x7f7f7f7f
using namespace std;
int N;
char str[12][12],str0[12][12];
char str1[12][12],str2[12][12],str3[12][12],str4[12][12];
bool ok=false;
bool Check(char s[12][12],char ss[12][12])
{
for(int i=0; i<N; ++i)
if(strcmp(s[i],ss[i]))
return false;
return ok=true;
}
void Change90(char s[12][12],char t[12][12])
{
for(int i=0; i<N; ++i)
for(int j=0; j<N; ++j)
t[j][N-1-i]=s[i][j];
}
void Reverse(char s[12][12],char t[12][12])
{
for(int i=0; i<N; ++i)
for(int j=0; j<N; ++j)
t[i][j]=s[i][N-1-j];
}
int main()
{
freopen("transform.in","r",stdin);
freopen("transform.out","w",stdout);
scanf("%d",&N);
for(int i=0; i<N; ++i) scanf("%s",str[i]);
for(int i=0; i<N; ++i) scanf("%s",str0[i]);
Change90(str,str1);
if(Check(str1,str0))
putchar('1');
else
{
Change90(str1,str2);
if(Check(str2,str0))
putchar('2');
else
{
Change90(str2,str3);
if(Check(str3,str0))
putchar('3');
}
}
if(!ok)
{
Reverse(str,str4);
if(Check(str4,str0))
putchar('4');
else
{
Change90(str4,str1);
if(Check(str1,str0))
putchar('5');
else
{
Change90(str1,str2);
if(Check(str2,str0))
putchar('5');
else
{
Change90(str2,str3);
if(Check(str3,str0))
putchar('5');
}
}
}
}
if(!ok)
{
if(Check(str,str0))putchar('6');
else putchar('7');
}
putchar('\n');
return 0;
}
Name That Number (namenum)
将字典中的每个名字转换成数字串。然后寻找与给定数字串相同的输出名字即可。
这里注意题目要输入长度至多12的数字,这意味着int是不够的,long long 应该可以,不过我还是使用了string。
/*
ID:kkkwjx1
LANG:C++
TASK:namenum
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <fstream>
using namespace std;
struct Name
{
char str[15];
string num;
};
char GetNum(char c)
{
if(c=='A'||c=='B'||c=='C')
return '2';
if(c=='D'||c=='E'||c=='F')
return '3';
if(c=='G'||c=='H'||c=='I')
return '4';
if(c=='J'||c=='K'||c=='L')
return '5';
if(c=='M'||c=='N'||c=='O')
return '6';
if(c=='P'||c=='R'||c=='S')
return '7';
if(c=='T'||c=='U'||c=='V')
return '8';
if(c=='W'||c=='X'||c=='Y')
return '9';
}
int main()
{
freopen("namenum.in","r",stdin);
freopen("namenum.out","w",stdout);
ifstream fin;
char buff[5000][15];
Name p[5000];
int k=0;
fin.open ("dict.txt", ifstream::in);
while (fin.good())
{
fin.getline(p[k].str,200);
int l=strlen(p[k].str);
for(int i=0; i<l; ++i)
p[k].num+=(GetNum(p[k].str[i]));
k++;
};
fin.close();
string tp;
cin>>tp;
bool ok=false;
for(int i=0; i<k; ++i)
if(tp==p[i].num)
{
cout<<p[i].str<<endl;
ok=true;
}
if(!ok) cout<<"NONE"<<endl;
return 0;
}
Palindromic Squares (palsquare)
进制转换问题。思路很简单,先将从十进制1开始循环,平方之后转换成B进制,看是否是回文,如果是则将原数转换成B进制并输出还有回文。
/*
ID:kkkwjx1
LANG:C++
TASK:palsquare
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
int B;
bool Judge(char str[20])
{
int l=strlen(str);
for(int i=0; i<=l/2; ++i)
if(str[i]!=str[l-1-i])
return false;
return true;
}
void Strrev(char str[20])
{
int l=strlen(str);
for(int i=0; i<l/2; ++i)
swap(str[i],str[l-1-i]);
}
void Convers(int val, char str[20],int R)
{
int i=0;
while(val)
{
int x=val%R;
if(x<10)
str[i++]=x+'0';
else
str[i++]='A'+(x-10);
val=val/R;
}
str[i]=0;
Strrev(str);
}
int main()
{
freopen("palsquare.in","r",stdin);
freopen("palsquare.out","w",stdout);
scanf("%d",&B);
for(int i=1; i<=300; ++i)
{
char s[20]= {0};
Convers(i*i,s,B);
if(Judge(s))
{
char t[20]= {0};
Convers(i,t,B);
printf("%s %s\n",t,s);
}
}
return 0;
}
Dual Palindromes (dualpal)
过了上个题这个就容易多了。枚举一下就行了。
/*
ID:kkkwjx1
LANG:C++
TASK:dualpal
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#define LN 30
using namespace std;
bool Judge(char str[LN])
{
int l=strlen(str);
for(int i=0; i<=l/2; ++i)
if(str[i]!=str[l-1-i])
return false;
return true;
}
void Strrev(char str[LN])
{
int l=strlen(str);
for(int i=0; i<l/2; ++i)
swap(str[i],str[l-1-i]);
}
void Convers(int val, char str[LN],int R)
{
int i=0;
while(val)
{
int x=val%R;
if(x<10)
str[i++]=x+'0';
else
str[i++]='A'+(x-10);
val=val/R;
}
str[i]=0;
Strrev(str);
}
bool OK(int val)
{
int cou=0;
char tmp[LN];
for(int i=2; i<=10; ++i)
{
Convers(val,tmp,i);
if(Judge(tmp)) cou++;
if(cou>=2)
return true;
}
return false;
}
int main()
{
freopen("dualpal.in","r",stdin);
freopen("dualpal.out","w",stdout);
int N,S;
scanf("%d%d",&N,&S);
for(int i=S+1,cou=0; cou<N; ++i)
{
if(OK(i))
{
printf("%d\n",i);
cou++;
}
}
return 0;
}