King's Cake (简单数学)
大意:一块n*m的蛋糕切成多个正方形(体),正方形尽可能大,求解正方形的个数。
分析:此过程像极了GCD
#include <iostream>
#include <cstdio>
using namespace std;
int sum=0;
void gcd(int a,int b){
sum++;
if(a<b) {
a=a^b; b=a^b; a=a^b;
}
if(a==b) { return ; }
else {
gcd(b,a-b);
}
}
int main()
{
int t;
cin>>t;
while(t--){
int a,b;
sum=0;
scanf("%d%d",&a,&b);
gcd(a,b);
printf("%d\n",sum);
}
return 0;
}
King's Phone (模拟)
大意:手机解锁密码。
手机屏幕九格:
1 2 3
4 5 6
7 8 9
密码条件:
- The password contains at least four points.
- Once a point has been passed through. It can't be passed through again.
- The middle point on the path can't be skipped, unless it has been passed through(
- Once a point has been passed through. It can't be passed through again.
- The middle point on the path can't be skipped, unless it has been passed through(
3427
is valid, but
3724
is invalid).
给出密码判断是否满足规定。
分析:直接模拟即可。但是注意给出的si,不是一位数哦
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char a[100];
char str[350];
int d[10];
int f[10][10];
int main()
{
f[1][3]=f[3][1]=2;
f[1][9]=f[9][1]=5;
f[1][7]=f[7][1]=4;
f[2][8]=f[8][2]=5;
f[3][9]=f[9][3]=6;
f[3][7]=f[7][3]=5;
f[6][4]=f[4][6]=5;
f[9][7]=f[7][9]=8;
int t,k;
cin>>t;
while(t--){
int top=0;
memset(d,0,sizeof(d));
scanf("%d",&k);
bool OK=1;
for(int i=0;i<k;i++){
scanf("%s",a);
int len=strlen(a);
for(int j=0;j<len;j++) {
str[top++]=a[j];
if(a[j]=='0') OK=0;
}
}
if(top<4) OK=0;
for(int i=0;i<top;i++){
if(i>0){
int mid=f[str[i]-'0'][str[i-1]-'0'];
if(mid!=0 && d[mid]==0) OK=0;
}
d[str[i]-'0']++;
if(d[str[i]-'0']>1) OK=0;
}
if(OK) puts("valid");
else puts("invalid");
}
return 0;
}
King's
Order(DP)
大意:给定字符串的长度,在字符串中最多存在3个连续相同的字符。求解符合条件的字符串的个数
#include <iostream>
#include <cstdio>
using namespace std;
const int mod=1000000007,N=2e3+10;
typedef long long LL;
LL dp[N];
int main()
{
dp[1]=26;
dp[2]=dp[1]*26;
dp[3]=dp[2]*26;
for(int i=4;i<N;i++){
dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])*25%mod;
}
int t,n;
cin>>t;
while(t--){
scanf("%d",&n);
printf("%I64d\n",dp[n]);
}
return 0;
}
King's Game
大意(分析):和普通的约瑟夫环很像,不过,第k轮是念到k的人出来。将约瑟夫环的解决过程稍作变化即可。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int work(int k,int n,int c){
if(c==1) return (n+k-1)%n;
else return (k+work(k+1,n-1,c-1))%n;
}
int main()
{
int t,n;
cin>>t;
while(t--){
scanf("%d",&n);
int k=1;
cout<<work(k,n,n)+1<<endl;
}
return 0;
}
第5道:
King's Pilots
额,图论是软肋。