A. The Useless Toy
题意:图片中有四个符号,V < ^ >, 按照顺时针从左到右变换
题目要求输入两个 上述字符,然后输入一个n, 第一个变换 n次变换好第二个字符是顺时针变换,还是逆时针变换,都不满足则输出“undifined”
#include<bits/stdc++.h>
using namespace std;
using namespace std;
char a,b;
char ch[4]={'v','<','^','>'};
int n;
int main()
{
cin>>a>>b>>n;
n%=4;
int t1,t2;
for(int i=0;i<4;i++)
{
if(ch[i]==a) t1=i;
else if(ch[i]==b) t2=i;
}
t2=(t2+4)%4;
if(ch[(n+t1+4)%4]==ch[t2]&&ch[(t1-n+4)%4]!=ch[t2]) cout<<"cw"<<endl;
else if(ch[(-n+t1+4)%4]==ch[t2]&&ch[(n+t1+4)%4]!=ch[t2]) cout<<"ccw"<<endl;
else cout<<"undefined"<<endl;
return 0;
}
B. The Festive Evening
直接暴力,标记每个字母的首次出现位置和最后出现位置, 将起始位置和最终位置看成一个区间, 求26个字母也就是26个区间的最大重叠数,也就是某一个数 i 处在的区间最多。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000100 ;
typedef long long ll;
#define cle(n) memset(n,0,sizeof(n))
using namespace std;
char s[maxn];
int n,k;
int first[maxn],last[maxn];
int a[maxn];
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>s[i];
if(k==26) cout<<"NO"<<endl;
else
{
cle(first); cle(last);
int ans=0;
for(int i=1;i<=n;i++)
{
if(first[s[i]-'A']==0)
{
first[s[i]-'A']=i;
}
last[s[i]-'A']=i;
}
for(int i=0;i<26;i++)
{
for(int j=first[i];j<=last[i];j++)
a[j]++;
}
for(int i=1;i<=n;i++)
ans=max(ans,a[i]);
if(k>=ans) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}
C. The Meaningless Game
题目大意: 输入一个n,然后再输入n行,每行有两个数a和b,表示玩游戏的两个人的分数(人和狗玩游戏)。问两个人的分数是否是符合游戏规则。
规则为,两个人初始分数为1,任意找一个自然数k,如果一个人赢则其分数乘以k^2,输的人乘以k,问有没有可能实现给出的分数。
解题思路:数学题
输入a,b, 假设得出的结论由四个自然数形成, 则结果大致为 a= (k1^2) *k2*(k3^2)*k4 和b= k1*(k2^2)*k3*(k4^2) 这样的形式。 当两个数相乘结果为 (k1^3)*(k2^3)*(k3^3)*(k4^3)。 可以对该数求出其三次方根 temp = k1*k2*k3*k4. 则 有 x=a/temp= k1*k3, y=b/temp= k2*k3; 如果有x*x*y==a&&y*y*x==b 则可以判断答案是否正确。
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
{
int n; ll a,b;
scanf("%d",&n);
while(n--)
{
scanf("%I64d %I64d",&a,&b); //此处用cin会超时
ll c=cbrt(a*b); //求一个数的三次方程
ll x=a/c, y=b/c;
bool flag= (x*x*y==a)&&(y*y*x==b);
puts(flag?"Yes":"No");
}
return 0;
}