题目链接:http://acm.nefu.edu.cn/JudgeOnline/contest.php
题目大多是思维题,算法较少,不是很难。下面是解题报告,并附有标程
A
题目已经说了,刷的时候每次刷一列或一行,做的时候每一行,每一列都遍历一遍,如果该行(列)的8个瓷砖都是黑的,那这一行(列)肯定刷过一次,最后统计一下就是结果。
值得一提的是如果64个瓷砖都是黑的,答案是8,不是16
#include <stdio.h> #include <string.h> #include <iostream> using namespace std; char a[10][10]; int main() { while(cin >> a[0]) { for(int i=1; i<8; i++) cin >>a[i]; int sum=0; int x,y; int count=0; for(int i=0; i<8; i++) for(int j=0; j<8; j++) if(a[i][j]=='B') count++; if(count==64) sum=8; else { for(int i=0; i<8; i++) { x=0; y=0; for(int j=0; j<8; j++) { if(a[i][j]=='B') x++; if(a[j][i]=='B') y++; } if(x==8) sum++; if(y==8) sum++; } } printf("%d\n",sum); } return 0; }
输出“1”就AC
C
贪心的一道题目。我们这样分析,如果只有两个队伍,我们若先排第一个队伍,那么总用时:x1+(x1*y2+x2);若先排第二个队伍那么总用时:x2+(x2*y1+x1)。如果第一种优于第二种的话那么x1+x1*y2+x2< x2+x2*y1+x1,我们把他化简一下x1/y1<x2/y2。我们把它推广到多个队伍,那么排队的先后顺序就是各个队伍:x1/y1<x2/y2。排完序后,模拟处理一下就可以了,详见代码。
#include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> using namespace std; const int maxn=100005; typedef long long LL; const int mod=365*24*60*60; int n; struct note { LL x,y; bool operator < (const note &other)const { return x*other.y<other.x*y; } }a[maxn]; int main() { // freopen("data.in","r",stdin); // freopen("data.out","w",stdout); int T,tt=0; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%I64d%I64d",&a[i].x,&a[i].y); } sort(a,a+n); LL maxx=0; for(int i=0;i<n;i++) { maxx=(maxx+a[i].x+maxx*a[i].y)%mod; } printf("Case #%d: %I64d\n",++tt,maxx); } return 0; }D
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; int n,a[1005],dp[1005],dp1[1005]; int main() { // freopen("data.in","r",stdin); //freopen("data.out","w",stdout); while(~scanf("%d",&n)) { for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=0;i<n;i++) { dp[i]=1; for(int j=0;j<i;j++) { if(a[j]<a[i]) dp[i]=max(dp[i],dp[j]+1); } } /* for(int i=0;i<n;i++) { printf("%d ",dp[i]); } printf("\n");*/ for(int i=n-1;i>=0;i--) { dp1[i]=1; for(int j=n-1;j>i;j--) { if(a[j]<a[i]) { dp1[i]=max(dp1[i],dp1[j]+1); } } } /**for(int i=0;i<n;i++) { printf("%d ",dp1[i]); } printf("\n");*/ int maxx=-1; for(int i=0;i<n;i++) { // printf("%d ",dp[i]+dp1[i]-1); maxx=max(maxx,dp[i]+dp1[i]-1); } printf("%d\n",maxx); } return 0; }
比较水的一道题,每次对相邻两个台阶做差,然后除以d,不能整除时再处理一下边沿就OK了,注意一个一个加会超时的
#include <stdio.h> #include <string.h> #include <iostream> using namespace std; int a[10005]; int main() { int n,d; //freopen("data.in","r",stdin); // freopen("data.out","w",stdout); while(~scanf("%d%d",&n,&d)) { for(int i=0; i<n; i++) scanf("%d",&a[i]); int sum=0; for(int i=1; i<n; i++) { if(a[i]<=a[i-1]) { int x=a[i-1]-a[i]; a[i]+=(x/d)*d; sum+=x/d; if(a[i]<=a[i-1]) { a[i]+=d; sum++; } } } printf("%d\n",sum); } return 0; }F
进制转换,没什么可说的。注意题目要求用最简分数表示,要除以分子分母的最大公约数,详见代码
#include <stdio.h> #include <string.h> #include <iostream> #include <cmath> using namespace std; int getsum(int a,int t) { int ans=0; while(a) { ans+=a%t; a/=t; } return ans; } int gcd(int a,int b) { while(b) { int t=a%b; a=b; b=t; } return a; } int main() { int n; int ans=0; // freopen("data.in","r",stdin); // freopen("data.out","w",stdout); while(cin>>n) { ans=0; for(int i=2; i<=n-1; i++) ans+=getsum(n,i); int tb=n-2; int tt=gcd(ans,tb); cout<<ans/tt<<'/'<<tb/tt<<endl; } return 0; }
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; long long n,m; int main() { // freopen("data.in","r",stdin); // freopen("data.out","w",stdout); while(~scanf("%lld%lld",&n,&m)) { if(n%2==0) { printf("%lld\n",((m+1)/2+m/2)*(n/2)); } else { printf("%lld\n",((m+1)/2+m/2)*(n/2)+(m+1)/2); } } return 0; }
比较基础的一道字符串判断题目,附上代码,自己去体会
#include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> using namespace std; char a[105]; int n,num[45]; int main() { //freopen("data.in","r",stdin); // freopen("data.out","w",stdout); while(~scanf("%d",&n)) { scanf("%s",a); for(int i=0;i<n;i++) { if(a[i]>='A'&&a[i]<='Z') a[i]=a[i]-'A'+'a'; } memset(num,0,sizeof(num)); for(int i=0;i<n;i++) { num[a[i]-'a']++; } int cnt=0; for(int i=0;i<26;i++) { if(num[i]==0) cnt=1; } if(cnt==0) printf("YES\n"); else printf("NO\n"); } return 0; }