湖南多校对抗赛(2015.05.24)部分解题报告(CSU1628-1638)

来源:互联网 发布:.手机域名是什么 编辑:程序博客网 时间:2024/05/22 06:05

比赛网址

A:简单题

AC代码:

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<queue>#include<algorithm>using namespace std;int a[105];int main(){    #ifndef ONLINE_JUDGE    freopen("in.cpp","r",stdin);    #endif // ONLINE_JUDGE    int n,cnt;     while(cin>>n>>cnt)     {          int sum=0;         int i;         for(int i=1;i<=n;i++)              scanf("%d",&a[i]);           for(i=1;i<=n;i++)          {              sum+=a[i];              if(sum>cnt) break;          }          cout<<i-1<<endl;     }     return 0;} /**************************************************************    Language: C++    Result: Accepted    Time:0 ms    Memory:1484 kb****************************************************************/

B题:简单题

AC代码:

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<queue>#include<algorithm>using namespace std;  int Y1,M1,D1,Y2,M2,D2;    int sum; string str; int IsY1() {     if(Y1>=2010)         return 1;         return 0; } int IsY2() {     if(Y2>=1991)        return 1;     return 0; } int Issum() {     if(sum>=41)        return 1;     return 0; }int main(){    #ifndef ONLINE_JUDGE    freopen("in.cpp","r",stdin);    #endif // ONLINE_JUDGE     int t;    cin>>t;     while(t--)     {         cin>>str;         cout<<str<<" ";       scanf("%d/%d/%d",&Y1,&M1,&D1);       scanf("%d/%d/%d",&Y2,&M2,&D2);       scanf("%d",&sum);       int cn=0;       if(IsY1()||IsY2())  puts("eligible");       else if(Issum())  puts("ineligible");       else            puts("coach petitions");       }     return 0;}/**************************************************************    Language: C++    Result: Accepted    Time:24 ms    Memory:1484 kb****************************************************************/

D题:题意题

只要知道有没有那么多的机子,还有某台设备有没有花费为0的时候就可以了!

AC代码:

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<queue>#include<vector>#include<algorithm>#define pi 3.1415926#define ep 1e-8#define MOD 1000000007using namespace std; //long long  C[maxn];int A[105][105];int vis[105];int main(){      int k,n,m;    while(~scanf("%d%d%d",&m,&n,&k))    {        memset(vis,0,sizeof(vis));        int cnt=0;        for(int i=0; i<m; i++)            for(int j=0; j<n; j++)                scanf("%d",&A[i][j]);        int flag;        int ff=0;        for(int i=0; i<m; i++)        {            flag=0;            for(int j=0; j<n; j++)            {                if(A[i][j]==0&&(!vis[j]))                {                    flag=1;                    cnt++;                    vis[j]++;                }            }            if(flag)  { ff++;flag=0;}        }        if(cnt>=n&&ff<=k)  puts("yes");        else            puts("no");     }      return 0;} /**************************************************************    Language: C++    Result: Accepted    Time:0 ms    Memory:1528 kb****************************************************************/

F:坑题

题目意思比较好懂,但是一直到比赛结束都没找到错误,后来看了下这位牛的报告,才知道错哪里http://blog.csdn.net/u010372095/article/details/45954371!

题意:有n个点,m条边,p个不安全点(p<=n),接下来一行输入p个不同的数代表不安全的点。再输入m行 a b c,表示a 点与b 点相连需花费c,  现在需把所有的点连起来花费最少,但必须满足一个条件:任意一个点A 到任意一个点B 所经过的路径中不能经过 不安全的点C  (A,B,C各不相同),问最少需要花费多少使这n个点相连,如果不能满足要求则输出 impossible
解题:先把n个点分成两部分:安全点,不安全点。再先把安全点用prime算法建一棵最小生成树,如果不能建成就可以输出impossible,如果可以,再向这棵树加不安全点做为叶子节点,每加一个不安全点找出一个与之相连的安全点边权最小的。如果找不到与之相连的安全点则不能满点要求。有特判:安全点为0,不安全点数等于1或2或 >=3时。

AC代码:

#include<stdio.h>#include<string.h>const int N = 1005;const int INF = 1<<28;int val[N][N],n,vis[N],p;int prime(){    int s[N],dis[N],mint,m,tm,k=0,sum=0;    for(int i=1; i<=n; i++){        s[i]=0; dis[i]=INF;        if(vis[i]==0)            m=i,k=1;    }    if(k==0)        return 0;    dis[m]=0; s[m]=1; tm=m;    while(k<n-p){        mint=INF;        for(int i=1; i<=n; i++)        if(!s[i]&&vis[i]==0){            if(dis[i]>val[m][i])                dis[i]=val[m][i];            if(mint>dis[i])                mint=dis[i],tm=i;        }        if(mint==INF)return -1;        m=tm; s[m]=1; sum+=mint; k++;    }    return sum;}int main(){    int m,a,b,c,aa[N];    while(scanf("%d%d%d",&n,&m,&p)>0){        for(int i=1; i<=n; i++){            vis[i]=0;            for(int j=1; j<=n;j++)                val[i][j]=INF;        }        for(int i=1; i<=p; i++){            scanf("%d",&a);            vis[a]=1; aa[i]=a;        }        while(m--){            scanf("%d%d%d",&a,&b,&c);            if(c<val[a][b])                val[a][b]=val[b][a]=c;        }        int sum=prime();        if(sum==-1)            printf("impossible\n");        else{             if(n-p==0)             {                 if(p==1)printf("0\n");                 else if(p==2){                    a=aa[1]; b=aa[2];                    if(val[a][b]==INF)                        printf("impossible\n");                    else printf("%d\n",val[a][b]);                 }                 else printf("impossible\n");                 continue;             }            int i,j,mint;            for(i=1; i<=p; i++){                a=aa[i]; mint=INF;                for(j=1;j<=n;j++)                if(val[a][j]<mint&&vis[j]==0)                   mint=val[a][j];                if(mint==INF)                    break;                sum+=mint;            }            if(i<=p)                printf("impossible\n");            else printf("%d\n",sum);        }    }    return 0;}

I:数学题

思路:直接组合

AC代码:

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<queue>#include<vector>#include<algorithm>#define pi 3.1415926#define ep 1e-8#define MOD 1000000007using namespace std;string str; const int maxn=1000005;long long  C[maxn];int main(){    #ifndef ONLINE_JUDGE    freopen("in.cpp","r",stdin);   #endif // ONLINE_JUDGE    int t,n,m;    cin>>t;    int Cas=0;    while(t--)    {       long long  cnt=1;        int n;        scanf("%d%d",&n,&m);        C[0]=1;        for(int i=1;i<=n;i++)            C[i]=(C[i-1]*(n-i+1)/i);        printf("%lld\n",C[m-1]);    }    return 0;}/**************************************************************    Problem: 1636    User: SkyHawk    Language: C++    Result: Accepted    Time:0 ms    Memory:9296 kb****************************************************************/

K:题意+模拟

题意:根据给定的数字算出r1,r2,然后对于r1,r2的四则运算我们要用一系列的整数来表示出来
思路:首先不难想到对于r1,r2我们先用分子分母表示出来,然后再对其进行四则运算,四则运算考虑了一下0的情况,最关键的是整数部分的处理,对于小数部分不断的循环去除便可以了。。。
例如相加得到77/5 = 15.4
首先输出15,然后剩下0.4
于是1/0.4=2.5,输出2
还剩下0.5,于是1/0.5,输出2,输出完毕,这一部分就是看余数与除数的关系
但是坑还是比较多!

AC代码:

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cstdlib>#include <cmath>#define maxn 505#define maxm 10005#define eps 1e-12#define mod 998244353#define INF 0x3f3f3f3ftypedef long long LL;typedef unsigned long long ULL;using namespace std;struct Fra{    LL e, d;    Fra(LL e = 0, LL d = 0) : e(e), d(d) {}    void inv()    {        swap(e, d);        if(d < 0) e = -e, d = -d;    }    void to()    {        LL g = __gcd(e, d);        e /= g, d /= g;        if(d < 0) e = -e, d = -d;    }    Fra operator + (const Fra& b) const {        Fra res = Fra(e * b.d + b.e * d, d * b.d);        res.to();        return res;    }    Fra operator - (const Fra& b) const {        Fra res = Fra(e * b.d - b.e * d, d * b.d);        res.to();        return res;    }    Fra operator * (const Fra& b) const {        Fra res = Fra(e * b.e, d * b.d);        res.to();        return res;    }    Fra operator / (const Fra& b) const {        Fra res = Fra(e * b.d, d * b.e);        res.to();        return res;    }}r1, r2;LL a[maxn];int n1, n2;void solve(Fra x){    int flag = 0;    if(x.e == 0) printf("0");    while(x.d && x.e) {        LL t = x.e / x.d;        if(x.e < 0 && x.e % x.d) t--;        if(flag == 0) flag = 1, printf("%lld", t);        else printf(" %lld", t);        x.e -= x.d * t;        x.to();        x.inv();    }    printf("\n");}void work(){    for(int i = 1; i <= n1; i++) scanf("%lld", &a[i]);    r1 = Fra(a[n1], 1LL);    for(int i = n1-1; i >= 1; i--) {        r1.inv();        r1 = r1 + Fra(a[i], 1LL);    }    for(int i = 1; i <= n2; i++) scanf("%lld", &a[i]);    r2 = Fra(a[n2], 1LL);    for(int i = n2-1; i >= 1; i--) {        r2.inv();        r2 = r2 + Fra(a[i], 1LL);    }    solve(r1 + r2);    solve(r1 - r2);    solve(r1 * r2);    solve(r1 / r2);}int main(){    while(scanf("%d%d", &n1, &n2)!=EOF) {        work();    }    return 0;}/**************************************************************    Language: C++    Result: Accepted    Time:0 ms    Memory:1492 kb****************************************************************/


1 0
原创粉丝点击