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 1000000007 using 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 1000000007 using 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 0x3f3f3f3f typedef 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 ****************************************************************/