源地址: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;
}