http://acm.zcmu.edu.cn/JudgeOnline/contest.php?cid=1088

 Eatting  水

题目意思是没有朋友的人全部离开,有1个朋友的所有人离开,有2个朋友的所有人离开,......,问最后最多剩下几个人?

n-2个人可以构成一个完全图,他们每个人有n-3个朋友,再加入两个人,这两个人分别与前面n-2个人相连,这样前面的n-2个人有n-1个朋友,后面两个人有n-2个朋友。

当去除后面加的两个人后,剩下n-2个人都有n-3个朋友,不能再去除。所以最多剩下n-2人。

当n=1 或者2 时,不可能有人剩下

如图:

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
int main()
{
    int n;
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        if(n==2||n==1)puts("0");
        else printf("%d\n",n-2);
    }
    return 0;
}
View Code

 

 约 dfs暴力

一行一行搜,假设现在搜第x行

1. x该行没有'o', 跳到x+1行

2. 有'o'在点(x,y)

分两种: 如果是(x+1,y-1)也是'o', 则在(x,y-1)点喷药水或者在(x,y)点喷药水

     如果是(x+1,y-1)不是'o',要在(x,y)喷药水

提供两组数据

2 4
..oo
oo.o

4 4
..o.
oooo
..oo
...o

 

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,m;
char mp[20][20];
int cnt;
int mi;
int dx[4]={0,0,1,1};
int dy[4]={0,1,0,1};
void dfs(int x,int y,int num,int sum)
{
    if(sum==cnt)
    {
    //    puts("final check:");
    //    for(int i=0;i<n;i++)puts(mp[i]);
        mi=min(num,mi);
        return;
    }
    if(x>n)return;
    while(y<m&&mp[x][y]=='.')y++;
    if(y>=m)dfs(x+1,0,num,sum);

    //反L,取或不取mp[x][y-1]处
    if(y-1>=0&&mp[x+1][y-1]=='o')
    {
        int v[4]={0};
        int c=0;
        for(int i=0;i<4;i++)
        {
            int xx=x+dx[i];
            int yy=y-1+dy[i];
            if(mp[xx][yy]=='o')
            {
                mp[xx][yy]='.';
                v[i]=1;
                c++;
            }
        }
     //   printf("1** %d %d\n",x,y);
    //    for(int i=0;i<n;i++)puts(mp[i]);

        dfs(x,y+1,num+1,sum+c);
        for(int i=0;i<4;i++)
        {
            if(v[i])
                mp[x+dx[i]][y-1+dy[i]]='o';
        }
    }
    //必取
    if(mp[x][y]=='o'){
        int v[4]={0};
        int c=0;
        for(int i=0;i<4;i++)
        {
            int xx=x+dx[i];
            int yy=y+dy[i];
            if(mp[xx][yy]=='o')
            {
                mp[xx][yy]='.';
                v[i]=1;
                c++;
            }
        }
     //   printf("2** %d %d\n",x,y);
      //  for(int i=0;i<n;i++)puts(mp[i]);
        dfs(x,y+2,num+1,sum+c);
        for(int i=0;i<4;i++)
        {
            if(v[i])
                mp[x+dx[i]][y+dy[i]]='o';
        }
    }

}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {

        cnt=0;
        for(int i=0;i<n;i++){
            scanf("%s",mp[i]);
            for(int j=0;j<m;j++){
                if(mp[i][j]=='o')
                {
                    cnt++;
                }
            }
        }
       /*
        if(ca==49)
        {
            printf("%d %d\n",n,m);
            for(int i=0;i<n;i++)puts(mp[i]);
        }
        ca++;
        */
        for(int i=0;i<20;i++)
        {
            for(int j=0;j<20;j++){
                if(i>=n||j>=m)mp[i][j]='.';
            }
            mp[i][15]='\0';
        }
        mi=99999999;

        dfs(0,0,0,0);
        printf("%d\n",mi);
    }
    return 0;
}
View Code

 

 

To Be The Calculator  计算加减乘除,水,模拟

 ~~~

 

火车奇遇 计算概率,线性规划

一条直线与矩形的位置有六种方式,因为w一样,所以斜率为1,把两条直线与矩阵相交都讨论清楚就可以了

 

#include<iostream>
#include<cstdio>
using namespace std;
int t1,t2,s1,s2,w;
double S;
double pow(double x)
{
    return x*x;
}
int main()
{
    while(~scanf("%d%d%d%d%d",&t1,&t2,&s1,&s2,&w))
    {
        S=(t2-t1)*(s2-s1);
        double area1=0,area2=0;
        if(t2+w<s1)area1=S;
        else if(t2+w<s2){
                if(t1+w<s1)area1=S-0.5*pow(t2+w-s1);
                else area1=0.5*pow(s2-(t1+w))-0.5*pow(s2-(t2+w));
        }
        else {
            if(t1+w<s1)area1=0.5*pow(s2-(t1+w))-0.5*pow(s1-(t1+w));
            else if(t1+w<s2)area1=0.5*pow(s2-(t1+w));
            else area1=0;
        }
        if(s2+w<t1)area2=S;
        else if(s2+w<t2){
            if(s1+w<t1)area2=S-0.5*pow(s2+w-t1);
            else area2=0.5*pow(t2-(s1+w))-0.5*pow(t2-(s2+w));
        }
        else{
            if(s1+w<t1)area2=0.5*pow(t2-(s1+w))-0.5*pow(t1-(s1+w));
            else if(s1+w<t2)area2=0.5*pow(t2-(s1+w));
            else area2=0;
        }
      //  printf("area1=%lf  area2=%lf  S=%lf\n",area1,area2,S);
        printf("%.8lf\n",(S-area1-area2)/S);
    }
    return 0;
}
View Code

 

1+++

水  数全由1构成,判断是否能整除n,每次对n取余即可

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int x=0;
        int i=0;
        while(++i)
        {
            x=(x*10+1)%n;
            if(x==0)
            {
                printf("%d\n",i);
                break;
            }
        }
    }
    return 0;
}
View Code

 

posted on 2015-04-08 22:14  kylehz  阅读(217)  评论(0)    收藏  举报