2017.8.29-9.4

这几天是十分充实而有意义的!!

和一群有着相同爱好的目标的人一起努力!!

老师家里有事回老家了 一些教学的任务就落在我们四个以前学过的人身上(说是“大佬”其实就是蒟蒻)

一直认真的研究自己负责的五道题   

其实就是几道模拟水题.....

 P1089 津津的储蓄计划

模拟  模拟    模拟   模拟   

唯一的点就是 最后不能直接*1.2 因为 int 是自动去尾的 会让你和答案有出入  所以这里要用一个小细节  (*120/100)  

上代码(代码极水一看就懂):

#include<bits/stdc++.h>//蒟蒻代码 不喜勿喷 
using namespace std;
int a[20];
int main()
{
for (int i=1;i<=12;i++)
	scanf("%d",&a[i]);//输入12个月的预算
int sum=0;
int cun=0;//要存到麻麻那里的钱 
for (int i=1;i<=12;i++)
{
  sum+=300;
  if (sum<a[i]) 
       {
	   printf("%d",-i);
	   exit(0);//退出整个程序..... 
	       }
  sum-=a[i];//减去预算
  cun+=(sum/100)*100;//交给麻麻 
  sum=sum%100;
		} 
sum+=cun*120/100;//这波操作很关键 
//如果你直接*1.2 int是去尾的 你会发现和答案差一点点
//*120/100就可以避免 
printf("%d",sum);
   return 0;
   }





P1202 [USACO1.1]黑色星期五Friday the Thirteenth


这题更水个人感觉    直接循环年份 月份  日期 处理好闰年和星期就好

直接上代码:

#include<bits/stdc++.h>//蒟蒻代码 不喜勿喷
using namespace std;
int a[10];//记录次数 
int b[20];
int main()
{
int n;
scanf("%d",&n);
int xiqi=0;
b[1]=31;b[2]=28;b[3]=31;b[4]=30;b[5]=31;b[6]=30;b[7]=31;b[8]=31;b[9]=30;b[10]=31;b[11]=30;b[12]=31;
for (int i=1900;i<=1900+n-1;i++)
for (int j=1;j<=12;j++)
{
	 if((i%4==0&&i%100!=0)||i%400==0)
	{
     b[2]=29;
     }//判断今年是不是闰年 
     else b[2]=28;
for (int k=1;k<=b[j];k++)
{
 xiqi++;
 if (xiqi>7) xiqi=1;
 if (k==13) a[xiqi]++;
       }
	      }
printf("%d %d ",a[6],a[7]);//这题真的坑现输出星期六和星期天题目也没说明!!! 
for (int i=1;i<=5;i++) 
	printf("%d ",a[i]);
    return 0;
   }





P1518 两只塔姆沃斯牛 The Tamworth Two


这题我觉得是五题里面最难的一道 有很多难处理的东西 

首先 很多同学在处理农夫和牛的位置的时候都是用交换的 这个方法咋一看没毛病  其实问题很大

举个例子:   

农夫和牛的位置如下:

C

F

如果此时农夫是向上走的  你用交换的话 会使牛换下来 导致一系列错误    

所以我的方法是记录农夫和牛的实时位置就好 不需要改动读进去的矩阵  

其次 判断抓不住的时候 有2种方法

第一种当然就是设一个很大的常数 超过 就说明不能抓住   

第二种是我无意间看到的大佬的方法 :

记录农夫和牛走过一个位置的次数  

如果到达五次 就说明  无法抓到  //需要细细体会


代码如下:

#include<bits/stdc++.h>
using namespace std;
char a[20][20];
int  heng[5];
int  shu[5];
int main()
{
heng[0]=0;heng[1]=1;heng[2]=0;heng[3]=-1;
shu[0]=-1;shu[1]=0;shu[2]=1;shu[3]=0;
	int x1,y1;//记录农夫的位置
	int x2,y2;//记录奶牛的位置 
for (int i=0;i<=11;i++)
for (int j=0;j<=11;j++)
 a[i][j]='*';//将边界设为障碍 
    for (int i=1;i<=10;i++)
    for (int j=1;j<=10;j++)
	    {cin>>a[i][j];
          if (a[i][j]=='F') {x1=i;y1=j;}
	      if (a[i][j]=='C') {x2=i;y2=j;}
	        }	        
int x=x1,y=y1; 
int i=x2,j=y2;
int time=0;
int fx1=0,fx2=0;//刚开始都是向北走 
int sum=0;//记录农夫回到初始的次数 
//如果农夫回到初始位置达五次说明无法抓住
while (1)
{
	time++;
 // if (x1==x && y1==y&&x2==i&&y2==j) sum++;
 // if (sum==4) {cout<<0;exit(0);}
  if (a[x1+shu[fx1]][y1+heng[fx1]]!='*')
 {
   x1+=shu[fx1];
   y1+=heng[fx1];
    } 
 else fx1=(fx1+1)%4;
  if (a[x2+shu[fx2]][y2+heng[fx2]]!='*')
 {
   x2+=shu[fx2];
   y2+=heng[fx2];
    } 
 else fx2=(fx2+1)%4;
if (x1==x2&&y1==y2)
{
   cout<<time;
   exit(0);
   }
 if (time>10000000) {cout<<0;exit(char a[20][20];
int  heng[5];
int  shu[5];
int main()
{
heng[0]=0;heng[1]=1;heng[2]=0;heng[3]=-1;
shu[0]=-1;shu[1]=0;shu[2]=1;shu[3]=0;
	int x1,y1;//记录农夫的位置
	int x2,y2;//记录奶牛的位置 
for (int i=0;i<=11;i++)
for (int j=0;j<=11;j++)
 a[i][j]='*';//将边界设为障碍 
    for (int i=1;i<=10;i++)
    for (int j=1;j<=10;j++)
	    {cin>>a[i][j];
          if (a[i][j]=='F') {x1=i;y1=j;}
	      if (a[i][j]=='C') {x2=i;y2=j;}
	        }	        
int x=x1,y=y1; 
int i=x2,j=y2;
int time=0;
int fx1=0,fx2=0;//刚开始都是向北走 
int sum=0;//记录农夫回到初始的次数 
//如果农夫回到初始位置达五次说明无法抓住
while (1)
{
	time++;
 // if (x1==x && y1==y&&x2==i&&y2==j) sum++;
 // if (sum==4) {cout<<0;exit(0);}
  if (a[x1+shu[fx1]][y1+heng[fx1]]!='*')
 {
   x1+=shu[fx1];
   y1+=heng[fx1];
    } 
 else fx1=(fx1+1)%4;
  if (a[x2+shu[fx2]][y2+heng[fx2]]!='*')
 {
   x2+=shu[fx2];
   y2+=heng[fx2];
    } 
 else fx2=(fx2+1)%4;
if (x1==x2&&y1==y2)
{
   cout<<time;
   exit(0);
   }
 if (time>10000000) {cout<<0;exit(0);}
    }

    return 0;
   }0);}
    }

    return 0;
   }

 P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers


这题目就是考你字符串的应用   
这题我们会用到字符串数组  
还有就是除不尽的情况要将未除完的钱保存起来

上代码:


#include<bits/stdc++.h>//蒟蒻代码 不喜勿喷 
using namespace std;
int a[200];//记录收到的钱 
int b[200];//记录送出的钱 
int sum;
int n;
string name[200];//记录名字 
string s;
void search(string ss)//找到他是第几个 
{
  for (int i=1;i<=n;i++)
  {
  if (ss==name[i]) 
  {sum=i;
   break;
     }
    }
  return;
   }


int main()
{

scanf("%d",&n);
for (int i=1;i<=n;i++)  
	cin>>name[i];
	int x,y;
for (int i=1;i<=n;i++)
{
  cin>>s;
  cin>>x>>y;
  if (y==0)  
  {
  search(s);
  a[sum]+=x;
  continue;
    }
  int num=x/y;
  search(s);
  a[sum]+=x-num*y;//将没除完的钱保存起来
  b[sum]+=x;
  for (int k=1;k<=y;k++)
   {
     cin>>s;
     search(s);
     a[sum]+=num;
	   }
     }
     for (int i=1;i<=n;i++)
     {
	   cout<<name[i]<<" ";
	   cout<<a[i]-b[i]<<endl;
	     }
  return 0;
   }





以上就是这几天一直努力的结果 
帮十几个人改了代码  也了解到一些常犯的错误 (能看出错误说明自己不会犯!!)
这几天十分有意义 感谢岳老师给我这个机会    
我会继续在oi道路上努力的走下去  !!!!!
加油
!!!!!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值