紀中2020.4.22普及C組模擬賽總結

唉!T3我結構體數組開到了一千萬,結果竟然空間超限!!!以後如果我開結構體數組不再開到一千萬了!(漲知識了

總分:

100+0+0(100)+0=100pts100+0+0(本來是100的嗚嗚嗚)+0=100pts

T1

本體模擬即可,按照題目的判斷方法:

  1. 所有信息掃描完畢,‘A’-‘Z’ 所有 26 個字母在原信息中均出現過並獲得了相應的“密字”。

這個做兩次:一次原信息,一次加密過的信息

for(int i=1; i<=27; i++) 
	 if(a2[i]==0)   //如果有一個字母沒有
	  {
	    cout<<"Failed";
		return 0;
	  }

2.原信息和加密過的信息長度不一樣

if(strlen(a)!=strlen(b))
	 {
	   cout<<"Failed";
	   return 0;
	 }
  1. 掃描中發現掌握的信息裏有明顯的自相矛盾或錯誤(違反S 國密碼的編碼規則)。例如某條信息“XYZ”被翻譯爲“ABA”就違反了“不同字母對應不同密字”的規則。

注意:這個要做兩次,一次是原信息,一次是加密過的信息

原信息的:

for(int i=1; i<=strlen(b+1); i++) 
	 if(b2[b[i]-64]==0)
	   b2[b[i]-64]=a[i];

加密過的:

for(int i=1; i<=strlen(a+1); i++)
     if(a2[a[i]-64]==0)  //儲存原來的
	   a2[a[i]-64]=b[i];
     else if(a2[a[i]-64]!=b[i]) //原來和這次不一樣
	   {
	     cout<<"Failed";
		 return 0;
	   }


我這樣講可能有點不清楚,那就綜合起來吧!

AC CodeAC~Code

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
char a[1010],a2[1010],b[1010],b2[1010],c[1010];
int main() 
{
    freopen("spy.in","r",stdin);
    freopen("spy.out","w",stdout);
    gets(a+1);gets(b+1);gets(c+1);
    if(strlen(a)!=strlen(b))
	 {
	   cout<<"Failed";
	   return 0;
	 }
    for(int i=1; i<=strlen(a+1); i++)
     if(a2[a[i]-64]==0)  //儲存原來的
	   a2[a[i]-64]=b[i];
     else if(a2[a[i]-64]!=b[i]) //原來和這次不一樣
	   {
	     cout<<"Failed";
		 return 0;
	   }
   for(int i=1; i<=27; i++) 
	 if(a2[i]==0)   //如果有一個字母沒有
	  {
	    cout<<"Failed";
		return 0;
	  }
    for(int i=1; i<=strlen(b+1); i++) 
	 if(b2[b[i]-64]==0)
	   b2[b[i]-64]=a[i];
    for(int i=1; i<=27; i++) 
	 if(b2[i]==0)   //同上
	  {
	    cout<<"Failed";
		return 0;
	  }
    for(int i=1; i<=strlen(c+1); i++) 
	   cout<<a2[c[i]-64];
    return 0;
}

T2

真推薦!!!洛谷這篇題解特詳細,看完秒懂。
(不過我數學還是差,不會推式子難受
在這裏插入圖片描述
在這裏插入圖片描述

AC CodeAC~Code

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int n,a0,a1,b0,b1;
int gcd(int x,int y)
{
	if(y==0)
	  return x;
	return gcd(y,x%y);
}
int main()
{
	freopen("son.in","r",stdin);
    freopen("son.out","w",stdout);
    cin>>n;
    while(n--)
	 {
	 	cin>>a0>>a1>>b0>>b1;
        int p=a0/a1,q=b1/b0,ans=0;   //先處理好
        for(int i=1; i*i<=b1; i++)//i<=sqrt(b1)-->i*i<=b1
         if(b1%i==0) //枚舉
		  {
             if(i%a1==0&&gcd(i/a1,p)==1&&gcd(q,b1/i)==1)//如公式所講
			   ans++;
             int y=b1/i;   //確定另一個因子
             if(i==y)
			   continue;
             if(y%a1==0&&gcd(y/a1,p)==1&&gcd(q,b1/y)==1)
			   ans++;
          }
        cout<<ans<<endl;
     }
    return 0;
}

T3

唉!

題解戳一戳這裏

T4

這道題細節很多,需要仔細做答,工程量較大。

這裏就不把模擬過程寫出來了,請看註釋:

AC CodeAC~Code

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int line[10][10],nine[10][10],list[10][10];  //記錄列,九宮格,行
int point[6]={0,6,7,8,9,10};  //靶形數獨對應分數
int map[10][10];    //整個數獨
int ans=-1,js;   //分別是總的答案和每次的統計(用來打擂臺)
struct node
{
    int line,js;
}tl[11];
bool cmp(const node&i,const node&j)
{
    return i.js<j.js;
}
int ninth(int i,int j)   //九宮格填數
{
    if(i<=3&&j<=3)
	  return 1;
    else if(i<=3&&j<=6)
	  return 2;
    else if(i<=3)
	  return 3;
    else if(i<=6&&j<=3)
	  return 4;
    else if(i<=6&&j<=6)
	  return 5;
    else if(i<=6)
	  return 6;
    else if(j<=3)
	  return 7;
    else if(j<=6)
	  return 8;
    return 9;
}
int print( )
{
    js=0;
    for(int i=1; i<=9; i++)
     for(int j=1; j<=9; j++)
        js+=(map[i][j]*point[min(min(i,10-i),min(j,10-j))]);
    ans=max(ans,js);
}
int dfs(int h,int x,int y)
{
    if(h==10)
	 {
        print();   //全部填完就統計
        return 0;
     }
    if(y==10)
	 {
        dfs(h+1,tl[h+1].line,1);  //填完一行下一行
        return 0;
     }
    if(!map[x][y])
	 {
        for(int i=1; i<=9; i++)
		 {
            if(line[x][i]==0&&list[y][i]==0&&nine[ninth(x,y)][i]==0)  //如果當前行沒填,列沒填,滿足填法就填
			 {
                line[x][i]=1,list[y][i]=1,nine[ninth(x,y)][i]=1;
                map[x][y]=i;   //標記行,列,九宮格,總數獨
                dfs(h,x,y+1);
                map[x][y]=0;   //回溯
                line[x][i]=0,list[y][i]=0,nine[ninth(x,y)][i]=0;
             }
         }
     }
    else 
	  dfs(h,x,y+1);   //往下一格DFS
}
int main()
{
	freopen("sudoku.in","r",stdin);
    freopen("sudoku.out","w",stdout);
    for(int i=1; i<=9; i++)
     {
       int k=0;
       for(int j=1; j<=9; j++)
	    {
          cin>>map[i][j];
          if(!map[i][j])
		    k++;
          line[i][map[i][j]]=1;   //先填一
          nine[ninth(i,j)][map[i][j]]=1;
          list[j][map[i][j]]=1;
        }
       tl[i].js=k,tl[i].line=i;   //賦初值
     }
    sort(tl+1,tl+10,cmp);
    dfs(1,tl[1].line,1);
    cout<<ans;
    return 0;
}

遠離馬虎,細心作答。

認真審題,不要亂棄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章