第四届“传智杯”全国大学生IT技能大赛(初赛AB组题解)
題目
- A 組原成績
- B 報告賦分
- C 競爭得分
- D 小卡與質數2
- 方法一
- 方法二
- 方法三
- E 蘿卜數據庫
- F 小卡與落葉
- G 小卡和質數
A 組原成績
簡單
#include<stdio.h> int main() {int h,e,t;scanf("%d%d%d",&t,&h,&e);int w = t * 0.2 + h *0.3 + e * 0.5;printf("%d",w);return 0; }B 報告賦分
簡單
#include<stdio.h> int main() {int t,a,p;scanf("%d",&t);while(t --) {scanf("%d%d",&a,&p);if( p < 16) a -= 10;if( p > 20) a -= p - 20; if( a < 0) a = 0;printf("%d\n",a);}return 0; }C 競爭得分
簡單,先找出最大值和最小值。
#include<stdio.h> int a[1005]; int main() {int n, maxn = -1, minn = 1005;scanf("%d",&n);for(int i = 0; i < n; i ++) {scanf("%d",&a[i]);if(a[i] > maxn) maxn = a[i];if(a[i] < minn) minn = a[i];}int t = maxn - minn;for(int i = 0; i < n; i ++) {int k = 100 * (a[i] - minn) / t;printf("%d ",k);}return 0; }注:這題不嚴謹,最大值和最小值可能相等,那么最大值 - 最小值不能做被除數。
D 小卡與質數2
題目描述:小卡最近迷上了質數,所以他想把任何一個數都轉化為質數!
小卡有 T 次詢問,每次給你一個數字 x,問有多少個比 x 小的非負整數 y,使得 x⊕y 是質數,其中 ⊕ 表示按位異或。
輸入格式:第一行一個正整數 T (1 ≤ T ≤ 10^5 ),表示有 T 組詢問。
接下來 T 行,每行一個正整數 x (1 ≤ x ≤10 ^ 6 )。
輸出格式:對于每組詢問,輸出一行一個整數,表示答案。
輸入樣例:
9 5 6 7 8 9 10 100 1000 10000輸出樣例:
2 4 4 2 2 4 22 163 1132注:這題理解方法二即可。
這三種方法都涉及埃氏篩,是素數的一種篩法,復雜度是O(nloglogn)
不懂篩法和位運算的看:素數、位運算
總結:遇到異或從二進制層面思考。
方法一
注:錯的,但我不知道錯哪,可以再優化一下,可能會超時。
題解:因為 x ^ y = z 等價于 x ^ z = y ,那可以用質數進行比較,優化暴力解法。但我不知道哪錯了。
方法二
注:方法二、方法三參考:https://www.cnblogs.com/Silymtics/p/test-chuanzhibei4th.html
#include<bits/stdc++.h> using namespace std; const int N = 1 << 20; int prime[N], a[N], t; //prime[]判斷素數,a[]存儲素數 int p[25]; void isprime() {int n = N - 1; prime[0] = prime[1] = 1;for(int i = 2; i <= n; i ++) {if(prime[i]) continue;a[t++] = i;for(int j = i; j <= n/i; j ++) prime[i*j] = 1; } } int main() {isprime();for(int i = 0; i < t; i ++) {int k = 0;for(int j = 22; j >= 0 ; j --) {if( (a[i] >> j) & 1) {k = j ; break;}}p[k]++;}int T;scanf("%d",&T);while(T--) {int x, ans = 0;scanf("%d",&x);for(int i = 0; i < 22 ; i ++) {if( (x >> i) & 1 ) ans += p[i];}printf("%d\n",ans);}return 0; }方法三
異或字典樹
#include<bits/stdc++.h> using namespace std; const int N = 1 << 20; int prime[N], a[N], t; void isprime() {int n = N - 1; prime[0] = prime[1] = 1;for(int i = 2; i <= n; i ++) {if(prime[i]) continue;a[t++] = i;for(int j = i; j <= n/i; j ++) prime[i*j] = 1; } } int son[N][2],ne[N],idx; void insert(int x) {int u = 0;ne[0] ++;for(int i = 21; i >= 0; i --) {int p = (x >> i) & 1;if(!son[u][p]) son[u][p] = ++idx;u = son[u][p];ne[u] ++;} } int search(int x) {int u = 0, ans = 0;for(int i = 21; i >= 0; i --) {int p = (x>>i) & 1;if(p) {ans += ne[son[u][p]];u = son[u][p^1];} else u = son[u][p];if(!u) return ans;}return ans; } int main() {isprime();for(int i = 0; i < t; i ++) {insert(a[i]);}int T;scanf("%d",&T);while(T--) {int x, ans = 0;scanf("%d",&x);ans = search(x);printf("%d\n",ans);}return 0; }E 蘿卜數據庫
題解:開一個二維數組存儲變量,這題比較簡單,暴力即可。
用 vector 可變長數組更簡單。
F 小卡與落葉
這題我不確定答案正確性。
記憶化搜索
題解:鄰接表存儲樹,bfs 搜索更新 k[i] 的狀態,記憶化搜索優化。
G 小卡和質數
思維題。
題解:x ^ y = 1 可的 | x - y | = 1,可得 x,y 一奇一偶,結合 x, y 是質數且只有 2 才是唯一的偶數質數可得:2 ^ 3 = 1 是唯一解。
總結
以上是生活随笔為你收集整理的第四届“传智杯”全国大学生IT技能大赛(初赛AB组题解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TraceView 的使用
- 下一篇: 就这一次看懂TraceView