cf_301

源地址:http://codeforces.com/contest/540

好久没做题了。。真是略微颓废。。感觉五一这三天本来挺空闲的,,但是什么都没做,也没出去玩。。烦。

A:水题,对应每个数字,我们看下顺时针转还是逆时针转的路程会比较短。

#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<time.h>
#include<queue>
#include<stack>
#include<iterator>
#include<math.h>
#include<stdlib.h>
#include<set>
#include<limits.h>
//#define ONLINE_JUDGE
#define eps 1e-8
#define INF 0x7fffffff
#define FOR(i,a) for((i)=0;i<(a);(i)++)
#define MEM(a) (memset((a),0,sizeof(a)))
#define sfs(a) scanf("%s",a)
#define sf(a) scanf("%d",&a)
#define sfI(a) scanf("%I64d",&a);
#define pf(a) printf("%d\n",a)
#define pfI(a) printf("%I64d\n",a)
#define pfs(a) printf("%s\n",a)
#define sfd(a,b) scanf("%d%d",&a,&b)
#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)
#define for1(i,a,b) for(int i=(a);i<b;i++)
#define for2(i,a,b) for(int i=(a);i<=b;i++)
#define for3(i,a,b)for(int i=(b);i>=a;i--)
#define MEM1(a) memset(a,0,sizeof(a))
#define MEM2(a) memset(a,-1,sizeof(a))
const double PI = acos(-1.0);
template<class T> T gcd(T a, T b) {return b ? gcd(b, a % b) : a;}
template<class T> T lcm(T a, T b) {return a / gcd(a, b) * b;}
template<class T> inline T Min(T a, T b) {return a < b ? a : b;}
template<class T> inline T Max(T a, T b) {return a > b ? a : b;}
#define ll long long
using namespace std;
int n,m;
#define M 1000010
int k;
char st[1010];
char ed[1010];
int main() {
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
//  freopen("out.txt", "w", stdout);
#endif
    while(scanf("%d",&n)!=EOF){
        sfs(st);
        sfs(ed);
        int ans=0;
        for(int i=0;i<n;i++){
            int res;
            if(st[i]<=ed[i]){
                res= Min(ed[i]-st[i],9-ed[i]+st[i]+1);
            }else{
                res= Min(st[i]-ed[i],9-st[i]+ed[i]+1);
            }
            ans += res;
        }
        printf("%d\n",ans);
    }
    return 0;
}
B:B我还真不是很会。。感觉不难。。但是刚开始没想出来。。

#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<time.h>
#include<queue>
#include<stack>
#include<iterator>
#include<math.h>
#include<stdlib.h>
#include<set>
#include<limits.h>
//#define ONLINE_JUDGE
#define eps 1e-8
#define INF 0x7fffffff
#define FOR(i,a) for((i)=0;i<(a);(i)++)
#define MEM(a) (memset((a),0,sizeof(a)))
#define sfs(a) scanf("%s",a)
#define sf(a) scanf("%d",&a)
#define sfI(a) scanf("%I64d",&a);
#define pf(a) printf("%d\n",a)
#define pfI(a) printf("%I64d\n",a)
#define pfs(a) printf("%s\n",a)
#define sfd(a,b) scanf("%d%d",&a,&b)
#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)
#define for1(i,a,b) for(int i=(a);i<b;i++)
#define for2(i,a,b) for(int i=(a);i<=b;i++)
#define for3(i,a,b)for(int i=(b);i>=a;i--)
#define MEM1(a) memset(a,0,sizeof(a))
#define MEM2(a) memset(a,-1,sizeof(a))
const double PI = acos(-1.0);
template<class T> T gcd(T a, T b) {return b ? gcd(b, a % b) : a;}
template<class T> T lcm(T a, T b) {return a / gcd(a, b) * b;}
template<class T> inline T Min(T a, T b) {return a < b ? a : b;}
template<class T> inline T Max(T a, T b) {return a > b ? a : b;}
#define ll long long
using namespace std;
int n,m;
#define M 1000010
int k;
int a[1010];
int main() {
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
//  freopen("out.txt", "w", stdout);
#endif
    int p,x,y;
    while(scanf("%d%d%d%d%d",&n,&k,&p,&x,&y)!=EOF){
        int tot=0;
        int num=0;
        for(int i=0;i<k;i++){
            sf(a[i]);
            tot += a[i];
            if(a[i]<y) num++;	//统计a[i]里面小于y的个数
        }
        if(n/2<num){		//如果小于y的个数都大于总数的一半了,那么就不能满足中位数大于y,故输出-1
            printf("-1\n");
            continue;
        }
        int p = Min(n-k,(n/2)-num);	//p要么代表剩余的个数,或者是还需要补的小于y的个数

        if(tot+p+(n-k-p)*y>x){	//tot是原数组的和,p个需要补的小于y的个数我们全部假设为1,然后还有(n-k-p)个数,我们假设全为y
            printf("-1\n");	//这样子假设才能使得所有数字的和最小,如果最小的还大于x了,那就输出-1
            continue;
        }

        for(int i=0;i<p;i++)	//p个要补的数视为1
            printf("1 ");
        for(int i=0;i<n-k-p;i++)	//n-k-p个补的数视为y
            printf("%d ",y);
        printf("\n");
    }
    return 0;
}
C:C题反而感觉不是很难。。bfs就行。

#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<time.h>
#include<queue>
#include<stack>
#include<iterator>
#include<math.h>
#include<stdlib.h>
#include<set>
#include<limits.h>
//#define ONLINE_JUDGE
#define eps 1e-8
#define INF 0x7fffffff
#define FOR(i,a) for((i)=0;i<(a);(i)++)
#define MEM(a) (memset((a),0,sizeof(a)))
#define sfs(a) scanf("%s",a)
#define sf(a) scanf("%d",&a)
#define sfI(a) scanf("%I64d",&a);
#define pf(a) printf("%d\n",a)
#define pfI(a) printf("%I64d\n",a)
#define pfs(a) printf("%s\n",a)
#define sfd(a,b) scanf("%d%d",&a,&b)
#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)
#define for1(i,a,b) for(int i=(a);i<b;i++)
#define for2(i,a,b) for(int i=(a);i<=b;i++)
#define for3(i,a,b)for(int i=(b);i>=a;i--)
#define MEM1(a) memset(a,0,sizeof(a))
#define MEM2(a) memset(a,-1,sizeof(a))
const double PI = acos(-1.0);
template<class T> T gcd(T a, T b) {return b ? gcd(b, a % b) : a;}
template<class T> T lcm(T a, T b) {return a / gcd(a, b) * b;}
template<class T> inline T Min(T a, T b) {return a < b ? a : b;}
template<class T> inline T Max(T a, T b) {return a > b ? a : b;}
#define ll long long
using namespace std;
int n,m;
#define M 1000010
int k;
char mp[510][510];
struct Node{
    int x,y;
};
Node st,ed;
int vis[510][510];
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
bool judge(Node tmp){
    if(tmp.x<=0||tmp.x>n||tmp.y<=0||tmp.y>m)
        return false;
    return true;
}
bool bfs(){
    queue<Node> q;
    q.push(st);
    Node cur,next;
    while(!q.empty()){
            cur = q.front();
            q.pop();
            for(int i=0;i<4;i++){
                next = cur;
                next.x += dir[i][0];
                next.y += dir[i][1];
                if(!judge(next)) continue;
                if(next.x == ed.x && next.y == ed.y && mp[next.x][next.y] == 'X'){
                        return true;
                }
                if(mp[next.x][next.y] == 'X') continue;
                mp[next.x][next.y] = 'X';
                q.push(next);
            }
    }
    return false;
}
int main() {
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
//  freopen("out.txt", "w", stdout);
#endif
    while(scanf("%d%d",&n,&m)!=EOF){
        for(int i=1;i<=n;i++)
            sfs(mp[i]+1);
        scanf("%d%d",&st.x,&st.y);
        scanf("%d%d",&ed.x,&ed.y);
        if(bfs())
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
D:D题我是不太会dp,不过觉得能看懂题解,所以也照写了一遍~

#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<time.h>
#include<queue>
#include<stack>
#include<iterator>
#include<math.h>
#include<stdlib.h>
#include<set>
#include<limits.h>
//#define ONLINE_JUDGE
#define eps 1e-8
#define INF 0x7fffffff
#define FOR(i,a) for((i)=0;i<(a);(i)++)
#define MEM(a) (memset((a),0,sizeof(a)))
#define sfs(a) scanf("%s",a)
#define sf(a) scanf("%d",&a)
#define sfI(a) scanf("%I64d",&a);
#define pf(a) printf("%d\n",a)
#define pfI(a) printf("%I64d\n",a)
#define pfs(a) printf("%s\n",a)
#define sfd(a,b) scanf("%d%d",&a,&b)
#define sft(a,b,c)scanf("%d%d%d",&a,&b,&c)
#define for1(i,a,b) for(int i=(a);i<b;i++)
#define for2(i,a,b) for(int i=(a);i<=b;i++)
#define for3(i,a,b)for(int i=(b);i>=a;i--)
#define MEM1(a) memset(a,0,sizeof(a))
#define MEM2(a) memset(a,-1,sizeof(a))
const double PI = acos(-1.0);
template<class T> T gcd(T a, T b) {return b ? gcd(b, a % b) : a;}
template<class T> T lcm(T a, T b) {return a / gcd(a, b) * b;}
template<class T> inline T Min(T a, T b) {return a < b ? a : b;}
template<class T> inline T Max(T a, T b) {return a > b ? a : b;}
#define ll long long
using namespace std;
int n,m;
#define M 1000010
int k;
double dp[110][110][110];//dp[i][j][k]代表剩下石头个数为i,剪刀为j,布为k
int main() {
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
//  freopen("out.txt", "w", stdout);
#endif
    int r,s,q;
    while(scanf("%d%d%d",&r,&s,&q)!=EOF){
        memset(dp,0,sizeof dp);
        dp[r][s][q] = 1;	//初始化
        for(int i=r;i>=0;i--){
            for(int j=s;j>=0;j--){
                for(int k=q;k>=0;k--){
                    int tot = (i+j+k)*(i+j+k-1)/2-i*(i-1)/2-j*(j-1)/2-k*(k-1)/2;
                    //tot是一次两两可组合的不同种族的总数,即C[2][i+j+k]-c[2][i]-c[2][j]-c[2][k]
                    if(i>0&&j>0)	//石头和剪刀
                        dp[i][j-1][k] += dp[i][j][k]*i*j/tot;//剪刀输,有*i*j种方法,概率就除以总数s
                    if(i>0&&k>0)	//石头和布
                        dp[i-1][j][k] += dp[i][j][k]*i*k/tot;//石头输,有*i*k种方法,概率就除以总数s
                    if(j>0&&k>0)	//剪刀和布
                        dp[i][j][k-1] += dp[i][j][k]*j*k/tot;//布输,有*j*k种方法,概率就除以总数s
                }
            }
        }
        double ans1=0,ans2=0,ans3=0;
        for(int i=0;i<=r;i++)
            ans1 += dp[i][0][0];
        for(int i=0;i<=s;i++)
            ans2 += dp[0][i][0];
        for(int i=0;i<=q;i++)
            ans3 += dp[0][0][i];
        printf("%.12f %.12f %.12f\n",ans1,ans2,ans3);
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值