CCF随便找题目入门练习,该博客用来积累代码。每做完一题都会更新,欢迎讨论和指正不足。(代码不多,主要用来自己积累吧,所以懒得加注释了)
201909-1 小明种苹果:
#include <iostream>
using namespace std;
int A[1010][1010],B[1010];
int main() {
int N,M,i,j,ma,mi,S;
cin >> N >> M;
for(i=0;i<N;i++){
for(j=0;j<M+1;j++){
cin>>A[i][j];
}
}
ma=0;
mi=0;
S=0;
for(i=0;i<N;i++){
B[i]=0;
for(j=1;j<M+1;j++){
B[i]+=A[i][j];
}
S+=A[i][0]+B[i];
if(-B[i]>ma){
ma=-B[i];
mi=i+1;
}
}
ma=B[mi-1];
cout<<S<<' '<<mi<<' '<<-ma;
return 0;
}
201909-2 小明种苹果(续):
#include <iostream>
using namespace std;
int A[1010][1010],B[1010];
int main() {
int N,m,i,j,k,mi,S1,T,s,s2,ii;
cin>>N;
T=0;
for(i=0;i<N;i++){
B[i]=0;
mi=0;
cin>>A[i][0];
for(j=1;j<A[i][0]+1;j++){
cin>>A[i][j];
if(A[i][j]>0&&j>mi){
mi=j;
}
}
S1=A[i][mi];
for(k=mi+1;k<A[i][0]+1;k++){
S1+=A[i][k];
}
T+=S1;
S1=A[i][1];
for(k=1;k<A[i][0]+1;k++){
if(A[i][k]>0){
if(S1!=A[i][k]){
B[i]=1;
}
}
else{
S1+=A[i][k];
}
}
}
s=0;
s2=0;
for(i=0;i<N;i++){
if(B[i]==1){
s++;
if(i+2<N){
if(B[i+1]==1&&B[i+2]==1){
s2++;
}
}
else if(i+1<N&&i+2==N){
if(B[i+1]==1&&B[0]==1){
s2++;
}
}
else if(i+1==N){
if(B[0]==1&&B[1]==1){
s2++;
}
}
else{
}
}
}
cout<<T<<' '<<s<<' '<<s2;
return 0;
}
201903-1 小中大:
#include <iostream>
#include <stdio.h>
using namespace std;
int a[100000];
int main()
{
int n,ma,mi,w,z1;
double z,x;
scanf("%d",&n);
mi=10000000;
ma=-10000000;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
if(a[i]>ma){
ma=a[i];
}
if(a[i]<mi){
mi=a[i];
}
}
w=n/2;
if(n%2==0){
x=(a[w-1]+a[w])/2.0;
x=x-int(x);
if(x==0){
z1=(a[w-1]+a[w])/2;
printf("%d %d %d",ma,z1,mi);
}
else{
z=(a[w-1]+a[w])/2.0;
printf("%d %.1f %d",ma,z,mi);
}
}
else{
z1=a[w];
printf("%d %d %d",ma,z1,mi);
}
return 0;
}
201903-2 二十四点:
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
int n,q,j,w,j1;
char a[8];
scanf("%d",&n);
getchar();
while(n--){
for(j=0;j<7;j++){
scanf("%c",&a[j]);
}
q=(int)(a[0]-48);
j=0;
while(j<6){
w=0;
if(a[j+1]=='+'){
q+=(int)(a[j+2]-48);
j+=2;
}
else if(a[j+1]=='-'){
q-=(int)(a[j+2]-48);
j+=2;
}
else if(a[j+1]=='x'||a[j+1]=='/'){
if(a[j-1]=='+'){
q-=(int)(a[j]-48);
}
else if(a[j-1]=='-'){
q+=(int)(a[j]-48);
}
else{
q=0;
}
j1=j-1;
if(a[j+1]=='x'){
w=(int)(a[j]-48)*(int)(a[j+2]-48);
j=j+2;
}
else{
w=(int)(a[j]-48)/(int)(a[j+2]-48);
j=j+2;
}
while(a[j+1]=='x'||a[j+1]=='/'){
if(a[j+1]=='x'){
w=w*(int)(a[j+2]-48);
j=j+2;
}
if(a[j+1]=='/'){
w=w/(int)(a[j+2]-48);
j=j+2;
}
}
if(a[j1]=='+'||j1<0){
q+=w;
}
else if(a[j1]=='-'){
q-=w;
}
}
}
if(n==0){
if(q==24){
printf("Yes");
}
else{
// printf("%d\n",q);
printf("No");
}
}
else{
if(q==24){
printf("Yes\n");
getchar();
}
else{
// printf("%d\n",q);
printf("No\n");
getchar();
}
}
}
return 0;
}
201812-1 小明上学:
#include <iostream>
#include <stdio.h>
using namespace std;
int a[100][2];
int main()
{
int r,y,g,n,s;
s=0;
scanf("%d %d %d",&r,&y,&g);
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d %d",&a[i][0],&a[i][1]);
if(a[i][0]==0||a[i][0]==1){
s+=a[i][1];
}
else if(a[i][0]==2){
s+=a[i][1]+r;
}
else{
}
}
printf("%d",s);
return 0;
}
201812-2 小明放学:
这个题目有个很大的坑! 代码半小时写出来,调试一小时一直60分。后来问了某大佬,告诉我这个题最多有10^5个红绿灯,而每个红绿灯时长最多不超过10^6,那也就是说,很可能经过所有红绿灯的总时长已经达到了10^5*10^6=10^11了,如果定义的是int 变量来存储时长,已经爆掉了。。。。所以要换成long long(原理自行百度)类型。果不其然,,,,改掉以后直接满分通过。。。
好的,俺百度好了:
#include <iostream>
#include <stdio.h>
using namespace std;
int a[100001][2];
int main()
{
int n,b,r,y,g;
long long s;
s=0;
scanf("%d %d %d",&r,&y,&g);
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d %d",&a[i][0],&a[i][1]);
//如果是通过道路
if(a[i][0]==0) {
s+=a[i][1];
}
//经过红绿灯
else{
//如果出发时候的那盏灯还没结束
if(s<=a[i][1]){
//如果出发时候是红灯,则加上该灯剩余的时间
if(a[i][0]==1){
s+=a[i][1]-s;
}
//如果出发时候是黄灯,则加上该黄灯剩余和红灯的时间
else if(a[i][0]==2){
s+=a[i][1]-s+r;
}
//如果是绿灯则直接通过
else{
//认为最后一刻不可通过。。。
if(s==a[i][1]){
s+=y+r;
}
else{
}
}
}
//出发时候的灯已结束
else{
//计算多出来的时间
b=(s-a[i][1])%(r+y+g);
//如果开始的时候是红灯
if(a[i][0]==1){
//如果多的时间在绿灯范围内
if(b<=g){
//认为最后一刻不可通过。。。
if(b==g){
s+=y+r;
}
else{
}
}
//如果不在绿灯范围内
else{
s+=y+r-(b-g);
}
}
//如果一开始是黄灯
else if(a[i][0]==2){
//到达时候为红灯
if(b<=r){
s+=r-b;
}
//到达时候为绿灯
else if(r<b&&b<=(r+g)){
//认为绿灯最后一刻不可通过。。。
if(b==r+g){
s+=y+r;
}
else{
}
}
//到达时候为黄灯
else{
s+=y-(b-r-g)+r;
}
}
//如果一开始是绿灯
else{
//到达时候在黄灯和红灯内
if(b<=y+r){
s+=y-b+r;
}
else{
}
}
}
}
}
printf("%lld",s);
return 0;
}
201809-1 卖菜:
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
int n,a[1000],b[1000];
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++){
if(i==0){
b[i]=(a[i]+a[i+1])/2;
}
else if(i==n-1){
b[i]=(a[i-1]+a[i])/2;
}
else{
b[i]=(a[i-1]+a[i+1]+a[i])/3;
}
}
for(int i=0;i<n;i++){
printf("%d ",b[i]);
}
return 0;
}
201809-2 买菜:
这个题又出来long的坑,这次一眼看穿!
#include <iostream>
#include <stdio.h>
using namespace std;
long long a[2000][2];
long long b[2000][2];
int main() {
int n;
long long s;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%lld %lld",&a[i][0],&a[i][1]);
}
for(int i=0;i<n;i++){
scanf("%lld %lld",&b[i][0],&b[i][1]);
}
s=0;
for(int i=0;i<n;i++){
for (int j=0;j<n;j++){
//如果a的下界大于b的下界且a的上界低于b的上界
if(a[i][0]>=b[j][0]&&a[i][1]<=b[j][1]){
s+=a[i][1]-a[i][0];
}
else if(a[i][1]>b[j][0]&&a[i][1]<=b[j][1]&&a[i][0]<=b[j][0]){
s+=a[i][1]-b[j][0];
}
else if(b[j][1]>a[i][0]&&b[j][1]<=a[i][1]&&b[j][0]<=a[i][0]){
s+=b[j][1]-a[i][0];
}
else if(a[i][1]>b[j][1]&&a[i][0]<b[j][0]){
s+=b[j][1]-b[j][0];
}
else{
}
}
}
printf("%lld",s);
return 0;
}
没怎么做过oj,做了几题就顶不住了,这也太难搞了。调整心态,慢慢来吧。