zoukankan      html  css  js  c++  java
  • Codeforces Round #382 (div2)

    A:题目:http://codeforces.com/contest/735/problem/A

     题意:出发点G,终点T,每次只能走k步,#不能走,问能否到达终点

     思路:暴力

     

     1 #include <stdio.h>
     2 #include <string.h>
     3 char str[110];
     4 void YES(){
     5     printf("YES
    ");
     6 }
     7 void NO(){
     8     printf("NO
    ");
     9 }
    10 void solve(int n,int k){
    11     int st,ed;
    12         for(int i=1;i<=n;i++){scanf(" %c",&str[i]);if(str[i]=='G') st=i;else if(str[i]=='T') ed=i;}
    13     if(st<ed){
    14         while(st<=ed){
    15             st+=k;
    16             if(st>n) {
    17                 NO();
    18                 return ;
    19             }
    20             if(st==ed){
    21                 YES();
    22                 return ;
    23             }
    24             if(str[st]=='#'){
    25                 NO();
    26                 return ;
    27             }
    28         }
    29         NO();
    30     }
    31     else if(st>ed){
    32         while(st>=ed){
    33             st-=k;
    34             if(st<1){
    35                 NO();
    36                 return ;
    37             }
    38             if(st==ed){
    39                 YES();
    40                 return ;
    41             }
    42             if(str[st]=='#'){
    43                 NO();
    44                 return ;
    45             }
    46         }
    47         NO();
    48     }
    49 
    50 }
    51 int main(){
    52     int n,k;
    53     while(scanf("%d %d",&n,&k)!=EOF){
    54         solve(n,k);
    55     }
    56 }

    B:题目:http://codeforces.com/contest/735/problem/B

      题意:有n个值,分成两部分分别有n1,n2个,求两部分的平均值之和的最大值

      思路:sum1/n1+sum2/n2 要尽量大,肯定排序从大往小选

      

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 const int maxn=1e5+10;
     7 int a[maxn];
     8 bool cmp(int a,int b){
     9     return a>b;
    10 }
    11 int main(){
    12     int n,n1,n2;
    13     while(scanf("%d %d %d",&n,&n1,&n2)!=EOF){
    14         for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    15             sort(a+1,a+1+n,cmp);
    16         int x=min(n1,n2);
    17         int y=max(n1,n2);
    18         long long sum1=0,sum2=0;
    19         for(int i=1;i<=x;i++) sum1+=a[i];
    20         for(int i=x+1;i<=x+y;i++) sum2+=a[i];
    21         double ans=0;
    22         ans=sum1/(x*1.0)+sum2/(y*1.0);
    23         printf("%.7f
    ",ans);
    24     }
    25     return 0;
    26 }

    C:题目:http://codeforces.com/contest/735/problem/C

      题意:两个人能比赛的条件为两个人之前打过比赛场数的差值不超过1,问胜者最多能打多少场比赛

      思路:递推,假设打n场所需要的最少人数是a[n],那么要打n+1场比赛,那么在打了n场的基础上,最少需要一个打了n-1场比赛的人才能打,所以要打n+1场比赛所需要的最少人数是a[n+1]=a[n]+a[n-1],即a[n+2]=a[n+1]+a[n],a[1]=1,a[2]=3;

      

     1 #include <cstdio>
     2 #include <cmath>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 const int maxn=100;
     7 long long Fi[maxn];
     8 void solve() {
     9     Fi[1]=2,Fi[2]=3;
    10     for(int i=3;i<=1000;i++) {
    11         Fi[i]=Fi[i-1]+Fi[i-2];
    12         if(Fi[i]>=(long long)1e18) {
    13             break;
    14         }
    15     }
    16 }
    17 int main(){
    18     long long n;
    19     solve();
    20     while(scanf("%I64d",&n)!=EOF) {
    21         int pos=lower_bound(Fi+1,Fi+1+87,n)-Fi;
    22         if(Fi[pos]>n) pos-=1;
    23         printf("%d
    ",pos);
    24     }
    25     return 0;
    26 }

    D:题目:http://codeforces.com/contest/735/problem/D

      题意:一个数n的最小花费为n的最大约数(除了自己本身) ,现在n可以被分成k个数,n=n1+n2+...+nk,(nk>=2),n现在所需要的费用是k个数的费用总和,求n的最小花费

      思路:很明显质数的最小费用是1,也就是看一个数能由多少个质数组成就是多少,一开始用的暴力过的,枚举前5000个数,对每个数找每次找最近的质数减掉然后再对n进行dp,dp[n]=min(dp[n-j]+dp[j],dp[n]),后来想了想好像就是哥德巴赫猜想。。

    即任一大于2的偶数都可写成两个素数之和,那么当n是素数是答案是1,n是偶数或者n-2是质数,那么答案是2,其他的答案就是3(因为可以奇数可以拆为一个奇数加一个偶数,素数肯定是奇数)

     1 #include <stdio.h>
     2 #include <iostream>
     3 #include <map>
     4 using namespace std;
     5 map<int,int> m;
     6 bool judge(int n){
     7     for(int i=2;i*i<=n;i++){
     8         if(n%i==0) return false;
     9     }
    10     return true;
    11 }
    12 const int maxn=5000;
    13 int dp[maxn];
    14 int Cal(int num){
    15     int cnt=0;
    16     while(num){
    17         for(int j=num;;j--){                
    18             if(judge(j)){
    19                 num-=j;
    20                 cnt++;
    21                 break;
    22             }
    23         }
    24     }
    25     return cnt;
    26 }
    27 int main(){
    28     int n;
    29     while(scanf("%d",&n)!=EOF){
    30         m[0]=0;
    31         m[1]=1;
    32         for(int i=2;i<=5010;i++){
    33             m[i]=Cal(i);
    34         }
    35         int cnt=0;
    36         for(int i=n;i>=max(n-5000,2);i--){
    37             m[i]=Cal(i);
    38             
    39         }
    40         for(int i=n;i>=max(n-5000,2);i--)
    41             m[n]=min(m[n],m[n-i]+m[i]);
    42         printf("%d
    ",m[n]);
    43     }
    44 }

    版本:

     1 #include <cstdio>
     2 bool judge(int n){
     3     for(int i=2;i*i<=n;i++)if(n%i==0) return false;
     4     return true;
     5 }
     6 int main(){
     7     int n;
     8     while(scanf("%d",&n)!=EOF){
     9         if(judge(n)){
    10             printf("1
    ");
    11         }
    12         else if(judge(n-2)||n%2==0){
    13             printf("2
    ");
    14         }
    15         else printf("3
    ");
    16     }
    17     return 0;
    18 }

    E,F留坑

  • 相关阅读:
    .net core 3.1 使用Redis缓存
    JavaSE 高级 第11节 缓冲输入输出字节流
    JavaSE 高级 第10节 字节数组输出流ByteArrayOutputStream
    JavaSE 高级 第09节 字节数组输入流ByteArrayInputStream
    JavaSE 高级 第08节 文件输出流FileOutputStream
    JavaSE 高级 第07节 文件输入流FileInputStream
    JavaSE 高级 第06节 初识I、O流
    JavaSE 高级 第05节 日期类与格式化
    JavaSE 高级 第04节 StringBuffer类
    JavaSE 高级 第03节 Math类与猜数字游戏
  • 原文地址:https://www.cnblogs.com/as3asddd/p/6115148.html
Copyright © 2011-2022 走看看