1. 程式人生 > 實用技巧 >Codeforces Round #660 (Div. 2) A. Captain Flint and Crew Recruitment、Captain Flint and a Long Voyage

Codeforces Round #660 (Div. 2) A. Captain Flint and Crew Recruitment、Captain Flint and a Long Voyage

題目連結:Captain Flint and Crew Recruitment

題意:

t組輸入,每一組輸入一個n。這裡我們說一下題目定義的近似質數概念:

“如果可以將正整數x表示為p⋅q,則將其定義為近似質數,其中1 <p <q,p和q是質數。 例如,整數6和10幾乎是質數(因為2⋅3= 6和2⋅5= 10),但整數1、3、4、16、17不是。”

這裡我們把n分成四個數的和,你需要使這四個數中的至少三個數都是近似質數,且要保證這四個數互不相等

如果能找出來這四個數就輸出,否則輸出NO

題解:

因為只需要三個數都是近似質數就行,那麼最小的三個近似質數是6,10,14那麼n的大小最小要等於31才可以有解

這裡要注意,題目要求四個數要互不相等,那麼我們就需要特判一下36,40,44

程式碼:

 1 #include<stack>
 2 #include<queue>
 3 #include<map>
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<iostream>
 7 #include<algorithm>
 8 #define fi first
 9 #define se second
10 using namespace std;
11 typedef long
long ll; 12 const int maxn=1e5+10; 13 const int mod=1e9+7; 14 const double eps=1e-8; 15 int a[maxn],b[maxn]; 16 int main() 17 { 18 int t; 19 scanf("%d",&t); 20 while(t--) 21 { 22 int n; 23 scanf("%d",&n); 24 if(n==36) 25 { 26 printf("
YES\n"); 27 printf("5 6 10 15\n"); 28 } 29 else if(n==40) 30 { 31 printf("YES\n"); 32 printf("15 6 10 9\n"); 33 } 34 else if(n==44) 35 { 36 printf("YES\n"); 37 printf("6 7 10 21\n"); 38 } 39 else if(n>6+10+14) 40 { 41 printf("YES\n"); 42 printf("6 10 14 "); 43 printf("%d\n",n-30); 44 } 45 else 46 { 47 printf("NO\n"); 48 } 49 } 50 return 0; 51 }
View Code

題目連結:Captain Flint and a Long Voyage

題意:

t組輸入,每組資料給你一個n,代表數x的長度,這個x是你需要找到的一個整數。你把x的每一位數轉化成二進位制形式後就是k

例如x=729,那麼k=111101001(因為7=111,2=10,9=1001).

然後你把k的末尾n個二進位制數刪除,就是最後的結果,例如上面的例子刪除之後就變成了111101

你要使這個結果儘可能的大,所以給你一個n,讓你求能使最後結果儘可能大的最小的那個x是多少,然後輸出x

題解:

你會發現整數8、9轉化成二進位制都是4位,所以我們的x肯定是由8、9構成的,那麼什麼時候用8什麼時候用9呢?

比較來看8、9的二進位制形式也就只有最後一位不同

題目又說輸出那個最小的x,題目的x轉化成k之後,還要刪除末尾的n個二進位制數。刪除這n個二進位制數由8這個整數構成才可以使得x最小

所以x的最後n/4+(n%4!=0)位輸出8,剩下的輸出9

程式碼:

 1 #include<stack>
 2 #include<queue>
 3 #include<map>
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<iostream>
 7 #include<algorithm>
 8 #define fi first
 9 #define se second
10 using namespace std;
11 typedef long long ll;
12 const int maxn=1e5+10;
13 const int mod=1e9+7;
14 const double eps=1e-8;
15 int a[maxn],b[maxn];
16 int main()
17 {
18     int t;
19     scanf("%d",&t);
20     while(t--)
21     {
22         int n;
23         scanf("%d",&n);
24         int ans=n/4;
25         if(n%4)
26             ans++;
27         for(int i=1;i<=n-ans;++i)
28             printf("9");
29         for(int i=1;i<ans;++i)
30             printf("8");
31         printf("8\n");
32     }
33     return 0;
34 }
View Code