• 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
    ");
    14     else printf("1
    ");
    15 }
    16 int main()
    17 {
    18     solve();
    19     return 0;
    20 }

    题目链接:B .Gerald is into Art

    神之队友,八个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
    ");
    18    else printf("NO
    ");
    19 }
    20 int main()
    21 {
    22     solve();
    23     return 0;
    24 }

     

    题目链接: C.Making a String

    题意:给定每一个字母出现的个数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
    ",sum);
    25 }
    26 int main()
    27 {
    28     solve();
    29     return 0;
    30 }

    题目链接: D.Bear and Elections

    记得寒假做过这道水题,我发现我一见到做过的题就懵了。。。

    就把第一个人票数一直和后面最大的比较,如果此人最大的小于后面最大的,他就再得一票,后面最大的那个就减一票,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
    ",ans);
    18 }
    19 int main()
    20 {
    21     solve();
    22     return 0;
    23 }

     

    题目链接:E.Finding Team Member

    我想说这个题寒假也做过……

    题意:对于每个人,他都想找到能和他组成最大力量的人匹配。

    题解:所以从大到小排序后,我从最大值入手,找到后取出标记,再继续找下一个未被标记且最大的值,贪心思想。

     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
    ",ans[2*n]);
    40 }
    41 int main()
    42 {
    43     solve();
    44     return 0;
    45 }

    题目链接: F.Kefa and Park

    老柴一眼看出来这是道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
    ",num);
    36 }
    37 int main()
    38 {
    39     solve();
    40     return 0;
    41 }

    题目链接: H.Cards

    找规律题目,这么多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 }

    题目链接:J.Duff in Love

    我还想说这个题寒假也做过。。。

    唯一分解定理。即 : 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
    ",sum);
    25 }
    26 int main()
    27 {
    28     solve();
    29     return 0;
    30 }

    I 和 G两个题还没看,未完待续。。。

  • 相关阅读:
    Dom对象,控制html元素
    运算符总结
    数组
    变量命名规则
    css实现气泡说明框
    深入理解CSS中的层叠上下文和层叠顺序
    jquery书写
    二级导航
    iis配置
    Android ListView无法触发ItemClick事件
  • 原文地址:https://www.cnblogs.com/littlepear/p/5400804.html
Copyright © 2020-2023  润新知