A
代码
#include<cstdio>
#include<cmath>
using namespace std;
int n,a,b,c; //a:R b:P c:S
char s[105];
char ans[105];
int vis[105],cnt=0;
void init(int n){
cnt=0;
for(int i=0;i<n;i++){
ans[i]=' ';
vis[i]=0;
}
}
int main(void){
int t;
scanf("%d",&t);
while(t--){
scanf("%d\n",&n);
scanf("%d%d%d\n",&a,&b,&c);
scanf("%s",s);
init(n);
for(int i=0;i<n;i++){
if(s[i]=='R'&&b!=0){
b--;
ans[i]='P';
cnt++;
}
else if(s[i]=='P'&&c!=0){
c--;
ans[i]='S';
cnt++;
}
else if(s[i]=='S'&&a!=0){
a--;
ans[i]='R';
cnt++;
}
}
if(cnt<ceil(n/2.)){
printf("NO\n");
continue;
}
printf("YES\n");
for(int i=0;i<n;i++){
if(ans[i]!=' ') printf("%c",ans[i]);
else{
if(a!=0){
a--;
printf("R");
}
else if(b!=0){
b--;
printf("P");
}
else if(c!=0){
c--;
printf("S");
}
}
}
printf("\n");
}
return 0;
}
B
总结
初始化数据量不能用MAX,会超时,for循环用n,m大小初始化即可。
代码
#include<iostream>
#include<string>
#include<string.h>
#define INF 0x3f3f3f
using namespace std;
int n,m;
string s[50010];
int row[50010],col[50010];
int main(void){
int q;
cin>>q;
while(q--){
cin>>n>>m;
for(int i=0;i<m;i++) col[i]=0;
for(int i=0;i<n;i++){
row[i]=0;
s[i].clear();
cin>>s[i];
for(int j=0;j<m;j++){
if(s[i][j]=='.'){
row[i]++;
col[j]++;
}
}
}
int ans=INF;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(s[i][j]=='.'&& ans>row[i]+col[j]-1)
ans=row[i]+col[j]-1;
else if(s[i][j]=='*'&& ans>row[i]+col[j])
ans=row[i]+col[j];
}
}
cout<<ans<<endl;
}
return 0;
}
C
思路
矩阵快速幂
fx fx-1
fx-1 fx-2
fx-2 fx-3
fx-3 fx-4
fx-4 fx-5
fx-5 fx-6
fx-6 fx-7
fx-7 fx-8
fx-8 fx-9
fx-9 fx-10
a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
1 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 1 0
总结
求模在最终结果再%p是wa,以下方式计算为正解:
ret.m[i][j] += m[i][k]*a.m[k][j] %p;
ret.m[i][j] %= p;
代码
#include<iostream>
#include<string.h>
using namespace std;
const int N=10;
int p;
struct Matrix{
int m[N][N];
Matrix operator*(const Matrix &a) const{
Matrix ret;
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
ret.m[i][j]=0;
for(int k=0;k<N;k++){
ret.m[i][j] += m[i][k]*a.m[k][j] %p;
ret.m[i][j] %= p;
}
}
}
return ret;
}
Matrix(){ memset(m,0,sizeof(m)); }
Matrix(const Matrix&a){ memcpy(m,a.m,sizeof(m)); }
} A;
void init(){
for(int i=0;i<N;i++) A.m[i][0]=N-i-1;
for(int i=0;i<N;i++)
for(int j=1;j<N;j++)
A.m[i][j]=0;
}
Matrix quik_pow(Matrix &a,long long n){
Matrix ret;
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(i==j) ret.m[i][j]=1;
else ret.m[i][j]=ret.m[j][i]=0;
}
}
while(n){
if(n&1) ret=ret*a;
a=a*a;
n>>=1;
}
return ret;
}
int main(void){
long long k;
init();
while(cin>>k>>p){
Matrix r;
for(int i=0;i<10;i++) cin>>r.m[0][i];
if(k<10){
cout<<k%p<<endl;
continue;
}
for(int j=0;j<9;j++) r.m[j+1][j]=1;
r=quik_pow(r,k-10+1);
r=r*A;
cout<<r.m[0][0]<<endl;
}
return 0;
}