Pro.C Card Game (First Edition)
foj2264题目链接
要么赢,要么输。
人生不也是这样吗?Do or die.
#include<stdio.h>
int main()
{
int t,c,n,i,x;
scanf("%d",&t);
for(c=1;c<=t;c++){
scanf("%d",&n);
for(i=1;i<=2*n;i++) scanf("%d",&x);
printf("Case %d: %.2f\n",c,n/2.0);
}
}
Pro.D Card Game (Second Edition)
foj2265题目链接
每次随机出牌意味着Fat brother的每一张牌遇到Maze的每张牌是等概率的,一共n种情况,统计出后者有几张牌小于前者的那一张牌,除以n即得该牌能赢的概率,再乘以1即得该牌得分的期望。
遍历Fat brother的每张牌分别计算,累加得到答案。
#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 10005
int t,c,n,i,a[N],b[N],p;
int main()
{
scanf("%d",&t);
for(c=1;c<=t;c++){
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&a[i]);
for(i=1;i<=n;i++) scanf("%d",&b[i]);
sort(b+1,b+1+n);
double s=0;
for(i=1;i<=n;i++){
p=lower_bound(b+1,b+1+n,a[i])-b;
s+=p-1;
}
s/=1.0*n;
printf("Case %d: %.2f\n",c,s);
}
}
Pro.E Card Game (Third Edition)
foj2266题目链接
英语阅读理解签到题
#include<stdio.h>
int main()
{
int t,c,n,i,x,s,a[10005];
scanf("%d",&t);
for(c=1;c<=t;c++){
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&a[i]);
for(s=0,i=1;i<=n;i++){
scanf("%d",&x);
if(a[i]+x>10) s++;
}
printf("Case %d: %d\n",c,s);
}
}
Pro.G Cutting Game
foj2268题目链接
联想多重背包的二进制优化
其本质可以参考一下这道题
#include<stdio.h>
int main()
{
int t,c,n,s;
scanf("%d",&t);
for(c=1;c<=t;c++){
scanf("%d",&n);
s=0;
while(n) n>>=1,s++;
printf("Case %d: %d\n",c,s);
}
}
Pro.I Two Triangles
foj2270题目链接
虽然代码写得略显冗杂,但是1A真的开心坏了昂^_^
遍历所有取三个点的情况
首先,三点共线不可取(代码中用叉积是否等于0判断是否三点共线)
其次,三角形可以平移、旋转,但是不能翻转(如第二组样例所见)
判全等用了SSS(三边相等),那怎么排除掉翻转的情况呢?
根据哪三边相等可以得出是哪三个顶点对应,然后通过判断某一点与该点对应点是否在其对边与对边的对应边的同侧(叉积的乘积大于0)
写这段代码的时候根本不敢复制粘贴,是一个字符一个字符认认真真敲出来的,生怕出错嘤嘤嘤
#include<stdio.h>
#include<math.h>
#define eps 1e-6
struct node
{
double x,y;
}a[15];
double dis(node p,node q)
{
return (p.x-q.x)*(p.x-q.x)+(p.y-q.y)*(p.y-q.y);
}
double eql(double p,double q)
{
return fabs(p-q)<eps;
}
double cj(node p,node q,node r)
{
return (q.x-p.x)*(r.y-p.y)-(r.x-p.x)*(q.y-p.y);
}
int main()
{
int c,t,n,i,j,k,u,v,w,ans;
double s1,s2,s3,s4,s5,s6,z1,z2;
scanf("%d",&t);
for(c=1;c<=t;c++){
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%lf%lf",&a[i].x,&a[i].y);
for(ans=0,i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
for(k=j+1;k<=n;k++){
if(eql(cj(a[i],a[j],a[k]),0)) continue;
s1=dis(a[i],a[j]),s2=dis(a[j],a[k]),s3=dis(a[k],a[i]);
z1=cj(a[i],a[j],a[k]),z2=cj(a[j],a[i],a[k]);
for(u=1;u<=n;u++)if(u!=i&&u!=j&&u!=k)
for(v=u+1;v<=n;v++)if(v!=i&&v!=j&&v!=k&&v!=u)
for(w=v+1;w<=n;w++)if(w!=i&&w!=j&&w!=k&&w!=u&&w!=v){
if(eql(cj(a[u],a[v],a[w]),0)) continue;
s4=dis(a[u],a[v]),s5=dis(a[v],a[w]),s6=dis(a[w],a[u]);
if(eql(s1,s4)){
if(eql(s2,s5)&&eql(s3,s6))
if(z1*cj(a[u],a[v],a[w])>0&&z2*cj(a[v],a[u],a[w])>0) { ans++;continue; }
if(eql(s2,s6)&&eql(s3,s5))
if(z1*cj(a[v],a[u],a[w])>0&&z2*cj(a[u],a[v],a[w])>0) { ans++;continue; }
}
if(eql(s2,s4)){
if(eql(s1,s5)&&eql(s3,s6))
if(z1*cj(a[w],a[v],a[u])>0&&z2*cj(a[v],a[w],a[u])>0) { ans++;continue; }
if(eql(s1,s6)&&eql(s3,s5))
if(z1*cj(a[w],a[u],a[v])>0&&z2*cj(a[u],a[w],a[v])>0) { ans++;continue; }
}
if(eql(s3,s4)){
if(eql(s1,s5)&&eql(s2,s6))
if(z1*cj(a[v],a[w],a[u])>0&&z2*cj(a[w],a[v],a[u])>0) { ans++;continue; }
if(eql(s1,s6)&&eql(s2,s5))
if(z1*cj(a[u],a[w],a[v])>0&&z2*cj(a[w],a[u],a[v])>0) { ans++;continue; }
}
}
}
printf("Case %d: %d\n",c,ans);
}
}
Pro.J X
foj2271题目链接
首先处理出输入过程中重复的边
在跑Floyd的过程中,当mp[i][j]的值能够被k更新、输入中有i到j的边且没被删除过的时候,说明可以删除掉原来i到j的边
wa点:
1、原来有的边才能够被删除
2、同一条边不能被重复删除
3、“mp[i][j]>=mp[i][k]+mp[k][j]”中的等号千万别落下,相等的时候意味着i到j的边可以被取代(删掉不影响)
#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 105
#define inf 0x3f3f3f3f
int mp[N][N],vs[N][N],t,c,n,m,i,j,k,u,v,w,ans;
int main()
{
scanf("%d",&t);
for(c=1;c<=t;c++){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)for(j=1;j<=n;j++) mp[i][j]=inf,vs[i][j]=0;
ans=0;
while(m--){
scanf("%d%d%d",&u,&v,&w),vs[u][v]=vs[v][u]=1;
if(mp[u][v]!=inf) ans++;
mp[u][v]=mp[v][u]=min(mp[u][v],w);
}
for(k=1;k<=n;k++)for(i=1;i<=n;i++)for(j=1;j<=n;j++)
if(mp[i][j]>=mp[i][k]+mp[k][j]){
mp[i][j]=mp[i][k]+mp[k][j];
if(vs[i][j]) ans++,vs[i][j]=vs[j][i]=0;
}
printf("Case %d: %d\n",c,ans);
}
}