A题:Stair, Peak, or Neither?
AC代码:
cpp
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--)
{
int a,b,c;
cin >> a >> b >> c;
if(a < b && b < c)
{
puts("STAIR");
}
else if(a < b && b > c)
{
puts("PEAK");
}
else
{
puts("NONE");
}
}
return 0;
}
B题:Upscaling
AC代码:
cpp
#include<iostream>
using namespace std;
int main()
{
int t;
cin >> t;
while(t--)
{
int n;
cin >> n;
if(n == 1)
{
printf("##\n##\n");
}
else
{
for(int i=1;i<=n;i++)
{
if(i%2!=0)
{
for(int j=1;j<=2;j++)
{
int a=0,b=0,w=0;
for(int k=1;k<=2*n;k++)
{
if(a == 2) a = 0,w = 1;
if(b == 2) b = 0,w = 0;
if(a!=2&&!w)
{
printf("#");
a++;
}
else if(b!=2&&w)
{
printf(".");
b++;
}
}
puts("");
}
}
else
{
for(int j=1;j<=2;j++)
{
int a=0,b=0,w=0;
for(int k=1;k<=2*n;k++)
{
if(a == 2) a = 0,w = 1;
if(b == 2) b = 0,w = 0;
if(a!=2&&!w)
{
printf(".");
a++;
}
else if(b!=2&&w)
{
printf("#");
b++;
}
}
puts("");
}
}
}
}
}
return 0;
}
此题找规律即可
C题: Clock Conversion
AC代码:
cpp
#include<iostream>
#include<map>
#include<cstring>
using namespace std;
int main()
{
map<int,int> mp{{13,1},{14,2},{15,3},{16,4},{17,5},{18,6},{19,7},{20,8},{21,9},{22,10},{23,11},{0,12}};
int t;
cin >> t;
while(t--)
{
string str;
cin >> str;
int hh = stoi(str.substr(0,2));
int mm = stoi(str.substr(3,5));
//cout << hh << ' ' << mm << endl;
if(hh <= 12)
{
if(hh == 12) {
printf("%02d:%02d PM\n",hh,mm);
continue;
}
if(hh == 0) hh = mp[hh];
printf("%02d:%02d AM\n",hh,mm);
}
else
{
hh = mp[hh];
printf("%02d:%02d PM\n",hh,mm);
}
}
return 0;
}
此题直接暴力打表即可
D题: D. Product of Binary Decimals
AC代码:
cpp
#include<iostream>
using namespace std;
//打表
int num[31] = {10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111, 10000,
10001, 10010, 10011, 10100, 10101, 10110, 10111, 11000, 11001, 11010,
11011, 11100, 11101, 11110, 11111, 100000};
bool check(int n)
{
int c = 0;
while(n)
{
c = n % 10;
if(c != 0 && c != 1) return false;
n = n / 10;
}
return true;
}
int main()
{
int t;
cin >> t;
while(t--)
{
int n;
cin >> n;
int cop = n;
if(n==1)
{
puts("YES");
continue;
}
int i;
for(i=0;i<30;i++)
{
while(cop%num[i] == 0)
{
cop = cop / num[i];
}
if(!check(cop)) cop = n;
else break;
}
if(i<30) puts("YES");
else puts("NO");
}
return 0;
}
此题同样打表即可
E题: Nearly Shortest Repeating Substring
思路
此题是一道字符串的+约数的题,时间复杂度为O(logN) * O(N),因为此题说s由x个k组成,S串中最多有一个字符不同,所以k肯定是S串长度的约数,所以只需要找S的约束串长度进行一 一 枚举比较即可
AC代码:
cpp
#include<iostream>
#include<cstring>
using namespace std;
int n,ans;
string str;
bool check(int len)
{
string s1,s2;
//求出截取的字符串
for(int i=0;i<len;i++)
{
s1 += str[i];
}
//如果长度够用,往后再挪动len位
if(len < str.size())
{
for(int i=len;i<len*2;i++)
{
s2 += str[i];
}
}
int cnt1=0;
int cnt2=0;
for(int i=0;i<str.size();i++)
{
int now = i % len;//周期为len所以直接%就好
if(s1[now] != str[i])
{
cnt1++;
}
if(cnt1 > 1) break;
}
if(cnt1 <= 1) return true;
for(int i=0;i<str.size();i++)
{
int now = i % len;//周期为len所以直接%就好
if(s2[now] != str[i])
{
cnt2++;
}
if(cnt2 > 1) break;
}
if(cnt2 <= 1) return true;
return false;
}
int main()
{
int t;
cin >> t;
while(t--)
{
bool flag = false;
int len=0,one=0,two=0;
cin >> n >> str;
ans = n;//如果没有满足就输出字符串本身长度
for(int i=1;i*i<=n;i++)
{
if(n % i == 0)
{
//两个约数
one = i;
two = n / i;
}
//这里是最短的情况
if(check(one))
{
cout << one << endl;
flag = true;
break;
}
if(one != two)
{
//two不一定是最短的所以要拿ans先存一下
if(check(two))
{
ans = two;
}
}
}
if(!flag) cout << ans << endl;
}
return 0;
}