1. 程式人生 > >【CQ18階梯賽第一場】題解

【CQ18階梯賽第一場】題解

sca 就是 scanf main ace con 連續 動態 return

【A-風格不統一如何寫程序】

輸入字符串,得到長度,對於每個字符:如果是大寫,則改為:‘_’+小寫;如果是‘_’則忽略‘_’,並且把後面的小寫改為大寫。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
char c[110];
int main()
{
    int
N,len,i; scanf("%d",&N); while(N--){ scanf("%s",c+1); len=strlen(c+1); for(i=1;i<=len;i++){ if(c[i]==_) { i++; c[i]=toupper(c[i]); } else if(c[i]>=A&&c[i]<=Z){ printf(
"_"); c[i]=tolower(c[i]); } printf("%c",c[i]); } printf("\n"); } return 0; }

【B-歌德巴赫猜想】

兩種解法:

一:先把素數篩選出來,然後試探即可。篩選素數一般是埃氏篩法和歐式篩(不會的請自學)。

二:枚舉p,q=n-p,然後判斷p,q是否是素數。判斷一個數X是否是素數的方式是枚舉2-sqrt(X),是否能被X整除。

代碼是第一種解法的歐氏篩。

#include<cmath>
#include
<cstring> #include<cstdlib> #include<cstdio> #include<algorithm> using namespace std; const int maxn=1000000; int p[maxn+10],vis[maxn+10],cnt,N; void solve() { for(int i=2;i<=N;i++){ if(!vis[i]) p[++cnt]=i; for(int j=1;j<=cnt&&i*p[j]<=N;j++){ vis[i*p[j]]=1; if(i%p[j]==0) break; } } } int main() { scanf("%d",&N);solve(); for(int i=1;i<=cnt;i++){ if(!vis[N-p[i]]) { printf("%d %d\n",p[i],N-p[i]); return 0; } } }

【C-數組重排2】

顯然,題意是要找最大上升子序列長度X,答案就是N-X,所以倒序檢驗是否是連續下降的,是則X++。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<memory>
#include<cstring>
using namespace std;
int a[100010],ans,now;
int main()
{
    int i,j,n;
    scanf("%d",&n);
    for(i=1;i<=n;i++) scanf("%d",&a[i]);
    now=n;
    for(i=n;i>=1;i--){
        if(a[i]==now){
            ans++;
            now--;
        }
    }
    printf("%d\n",n-ans);
    return 0;
}

【D-方格取數】

基礎DP(動態規劃),為了讓兩人路徑不相交,我們使二人一起走,第一位從(2,1)出發,第二位從(1,2)出發,(保證第一位在第二位的下面,即i>j)在走X步的情況下,第一位走到(i,X-i),第二位走到(j,X-j),用dp[X][i][j]表示二人分別走到(i,X-i) (j,X-j)的最大值。

第一位可能從上面或者左邊來,第二位同理。那麽X的來源有(i,X-i-1)+(j,X-j-1);(i,X-i-1)+(j-1,X-j); (i-1,X-i)+(j,X-j-1) ; (i-1,X-i-1)+(j-1,X-j);分別取最優解即可。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int dp[410][210][210],a[210][210]; 
int main()
{
    int n,i,k,j;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
     for(j=1;j<=n;j++)
      scanf("%d",&a[i][j]);
dp[
3][2][1]=a[1][1]+a[1][1]+a[2][1]+a[1][2];
for(i=4;i<=n+n-1;i++) for(j=1;j<=n;j++) for(k=1;k<=j-1;k++){ dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k-1]); dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k]); dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-1][k]); dp[i][j][k]=max(dp[i][j][k],dp[i-1][j-1][k-1]); dp[i][j][k]+=a[j][i-j]+a[k][i-k]; } printf("%d\n",dp[n+n-1][n][n-1]+a[n][n]+a[n][n]); return 0; }

【CQ18階梯賽第一場】題解