chd校内选拔赛题目+题解
题目链接 A. Currency System in Geraldion
有1时,所有大于等于1的数都可由1组成。没有1时,最小不幸的数就是1.
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 void solve(){ 6 int n,x; 7 scanf("%d",&n); 8 int flag = 0; 9 for(int i = 1; i<=n; i++){ 10 scanf("%d",&x); 11 if(x == 1) flag = 1; 12 } 13 if(flag) printf("-1\n"); 14 else printf("1\n"); 15 } 16 int main() 17 { 18 solve(); 19 return 0; 20 }
神之队友,八个if条件秒A,orz...
最后给的两个矩形每个长和宽翻过来倒过去,有四种情况。再和给的第一个矩形匹配总共有八种情况。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 void solve(){ 6 int a1,b1,a2,b2,a3,b3; 7 cin>>a1>>b1>>a2>>b2>>a3>>b3; 8 int flag = 0; 9 if(a2+a3<=a1 && max(b2,b3)<=b1) flag = 1; 10 if(a2+a3<=b1 && max(b2,b3)<=a1) flag = 1; 11 if(a2+b3<=a1 && max(b2,a3)<=b1) flag = 1; 12 if(a2+b3<=b1 && max(b2,a3)<=a1) flag = 1; 13 if(b2+a3<=a1 && max(a2,b3)<=b1) flag = 1; 14 if(b2+a3<=b1 && max(a2,b3)<=a1) flag = 1; 15 if(b2+b3<=a1 && max(a2,a3)<=b1) flag = 1; 16 if(b2+b3<=b1 && max(a2,a3)<=a1) flag = 1; 17 if(flag) printf("YES\n"); 18 else printf("NO\n"); 19 } 20 int main() 21 { 22 solve(); 23 return 0; 24 }
题意:给定每一个字母出现的个数ai,组成一个最长的字母串.
此字母串满足的条件:
1.其中的每个字母出现的总次数不超过ai.
2.每个字母出现的次数必须是不同的。
题解:这个题直接贪心。 从最大值开始,拿第一组样例,2 5 5来说
排序后2 5 5,从最后5开始,找局部最优解。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int a[30]; 6 void solve(){ 7 int n; 8 scanf("%d",&n); 9 for(int i = 0; i<n; i++) scanf("%d",&a[i]); 10 sort(a,a+n); 11 int maxn = 1e9+7; 12 long long sum = 0; 13 for(int i = n-1; i>=0; i--){ 14 if(maxn == 0) break; 15 if(maxn>=a[i]){ 16 sum += a[i]; 17 maxn = a[i] - 1; 18 } 19 else{ 20 sum += maxn; 21 maxn--; 22 } 23 } 24 printf("%I64d\n",sum); 25 } 26 int main() 27 { 28 solve(); 29 return 0; 30 }
记得寒假做过这道水题,我发现我一见到做过的题就懵了。。。
就把第一个人票数一直和后面最大的比较,如果此人最大的小于后面最大的,他就再得一票,后面最大的那个就减一票,ans+1,排序,直到后面没有比它还大的。数据较小,不会超时,至于司老大说的二分法我还没有领会。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int a[105]; 6 void solve(){ 7 int n,ans = 0; 8 scanf("%d",&n); 9 for(int i = 0; i<n; i++) scanf("%d",&a[i]); 10 while(1){ 11 sort(a+1,a+n); 12 if(a[n-1]<a[0]) break; 13 a[n-1]--; 14 a[0]++; 15 ans++; 16 } 17 printf("%d\n",ans); 18 } 19 int main() 20 { 21 solve(); 22 return 0; 23 }
我想说这个题寒假也做过……
题意:对于每个人,他都想找到能和他组成最大力量的人匹配。
题解:所以从大到小排序后,我从最大值入手,找到后取出标记,再继续找下一个未被标记且最大的值,贪心思想。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 const int maxn = 805; 6 int cnt[maxn][maxn]; 7 int flag[maxn],ans[maxn]; 8 struct node{ 9 int x,y,v; 10 }arr[maxn*maxn]; 11 bool cmp(node A,node B){ 12 return A.v>B.v; 13 } 14 void solve(){ 15 int n; 16 scanf("%d",&n); 17 int k = 0; 18 for(int i = 2; i<=n*2; i++){ 19 for(int j = 1; j<i; j++){ 20 scanf("%d",&cnt[i][j]); 21 arr[k].x = i; 22 arr[k].y = j; 23 arr[k].v = cnt[i][j]; 24 k++; 25 } 26 } 27 sort(arr,arr+k,cmp); 28 for(int i = 0; i<k; i++){ 29 if(!flag[arr[i].x]&&!flag[arr[i].y]){ 30 ans[arr[i].x] = arr[i].y; 31 ans[arr[i].y] = arr[i].x; 32 flag[arr[i].x] = 1; 33 flag[arr[i].y] = 1; 34 } 35 } 36 for(int i = 1; i<2*n; i++){ 37 printf("%d ",ans[i]); 38 } 39 printf("%d\n",ans[2*n]); 40 } 41 int main() 42 { 43 solve(); 44 return 0; 45 }
老柴一眼看出来这是道dfs题,可惜没时间做了。。。
题解:首先记录每个点的度数方便找到叶子节点。通过记录路上连续的猫的个数,判断是否走该点,然后继续遍历。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<vector> 5 using namespace std; 6 typedef long long ll; 7 const int maxn = 1e5+5; 8 vector<int> path[maxn]; 9 int cat[maxn],leaf[maxn]; 10 int vis[maxn]; 11 int n,m,num = 0; 12 void dfs(int u,int numcat){ 13 if(vis[u]) return; 14 else vis[u] = 1; 15 if(cat[u]) numcat++; 16 else numcat = 0; 17 if(numcat>m) return;//判断猫的数量是否超过m 18 if(leaf[u] == 1&&u != 1) num++;//记录方案数 19 for(int i = 0; i<path[u].size(); i++){ 20 dfs(path[u][i],numcat); 21 } 22 } 23 void solve(){ 24 scanf("%d%d",&n,&m); 25 for(int i = 1; i<=n; i++) scanf("%d",&cat[i]); 26 int x,y; 27 for(int i = 1; i<=n-1; i++){ 28 scanf("%d%d",&x,&y); 29 path[x].push_back(y); 30 path[y].push_back(x); 31 leaf[x]++;//寻找叶子节点 32 leaf[y]++; 33 } 34 dfs(1,0); 35 printf("%d\n",num); 36 } 37 int main() 38 { 39 solve(); 40 return 0; 41 }
找规律题目,这么多if else写的我醉醉的。。。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<vector> 5 using namespace std; 6 void solve(){ 7 int n,i = 0,j = 0,k = 0; 8 scanf("%d",&n); 9 getchar(); 10 char c; 11 for(int p = 0; p<n; p++){ 12 scanf("%c",&c); 13 if(c == 'B') i++; 14 else if(c == 'G') j++; 15 else if(c == 'R') k++; 16 } 17 if(i >= 1 && j == 0 && k == 0) puts("B"); 18 else if(i == 0 && j >= 1 && k == 0) puts("G"); 19 else if(i == 0 && j == 0 && k >= 1) puts("R"); 20 else if(i == 1 && j == 1 && k == 0) puts("R"); 21 else if(i == 1 && j == 0 && k == 1) puts("G"); 22 else if(i == 0 && j == 1 && k == 1) puts("B"); 23 else if(i > 1 && j == 1 && k == 0) puts("GR"); 24 else if(i > 1 && j == 0 && k == 1) puts("GR"); 25 else if(i == 1 && j > 1 && k == 0) puts("BR"); 26 else if(i == 1 && j == 0 && k > 1) puts("BG"); 27 else if(i == 0 && j > 1 && k == 1) puts("BR"); 28 else if(i == 0 && j == 1 && k > 1) puts("BG"); 29 else puts("BGR"); 30 } 31 int main() 32 { 33 solve(); 34 return 0; 35 }
我还想说这个题寒假也做过。。。
唯一分解定理。即 : n = p1^e1* p2^e2 * p3^e3* … * pr^er;其中p为质数。
注意数据范围,所有素数乘起来便没有平方。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 typedef long long ll; 6 ll p[100]; 7 void solve(){ 8 ll n; 9 scanf("%I64d",&n); 10 int ans = 0; 11 for(ll i = 2; i*i<=n; i++){ 12 if(n%i == 0){ 13 p[ans++] = i; 14 while(n%i == 0){ 15 n /= i; 16 } 17 } 18 } 19 if(n>1) p[ans++] = n; 20 ll sum = 1; 21 for(int i = 0; i<ans; i++){ 22 sum = sum*p[i]; 23 } 24 printf("%I64d\n",sum); 25 } 26 int main() 27 { 28 solve(); 29 return 0; 30 }
I 和 G两个题还没看,未完待续。。。