欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

class03 zhc

时间:2024-05-05 08:00 作者:admin 点击:
结构体类型:将一类事物总结成的类型 struct 钱{ //属性 int 面值; string 国家; double x,y; //功能 void 花钱(); void 砸人(); }; 一本通 1983 struct P{ int time; int money; bool use=true; }; P p[100050]; int n,c,m

结构体类型:将一类事物总结成的类型

struct 钱{

   //属性  

   int 面值;

   string 国家;

   double x,y;

   //功能

   void 花钱();

   void 砸人();

};


一本通 1983

struct P{

   int time;

   int money;

   bool use=true;

};

P p[100050];

int n,c,m,t,x=0,sum=0;

int ht=0;

int main()

{

   cin>>n;

   while(n--){

       cin>>c>>m>>t;

       if(c==0){

           p[x++]={m,t,true};

           sum+=m;

       }

       else{

           int j=ht;

           for(;j<x;j++){

               if(t-p[j].time<=45){

                   ht=j;break;

               }

           }

           for(;j<x;j++){

               if(p[j].use==true&&p[j].money>=m){

                   p[j].use=false;

                   break;

               }

           }

           if(j==x) sum+=m;

       }

   }

   cout<<sum;

   return 0;

}


http://www.usaco.org 注册账号

账号:user0225

密码:7b7d870

邮箱:fangyansong123123@163.com



枚举算法

1、已知:ABCDEX是不同的6个数字,且满足以下公式

ABCDE*X=EDCBA

输出:ABCDEX各是多少


for(int a=1;a<10;a++){

for(int b=0;b<10;b++){

for(int c=0;c<10;c++){

for(int d=0;d<10;d++){

for(int e=1;e<10;e++){

for(int x=2;x<10;x++){

   if(a!=b&&a!=c&&a!=d...){

       if(x*(a*10000+b*1000+c*100+d*10+e)==e*10000+....){

           cout<<ans;

       }

   }

}}}}}}


for(int num=10234;num<50000;num++){

   string s=to_string(num);

   char c[128]={};

   bool f=true;

   for(int i=0;i<s.size();i++){

       c[s[i]]++;

       if(c[s[i]]>1){

           f=false;

           break;

       }

   }

   if(f){

       for(int x=2;x<10;x++){

           string ss=to_string(x);

           if(s.find(ss)<s.size()) continue;

           ss=s;

           reverse(s.begin(),s.end());//[地址开头,地址结尾) 内存倒序

           if(stoi(ss)*x==stoi(s)){

               cout<<ans;

           }

       }

   }

}


2、五名运动员参加比赛,各自进行了预测

预测如下:

A说:E是第一名

B说:我是第二名

C说:A肯定垫底

D说:C肯定不是第一名

E说:D是第一名

比赛结果发现:E不是第二也不是第三,没有并列情况,且只有第一名和第二名猜对了

输出:ABCDE各是第几名

for(int a=1;a<6;a++){

for(int b=1;b<6;b++){

for(int c=1;c<6;c++){

for(int d=1;d<6;d++){

for(int e=1;e<6;e++){

   if(互不相等){

       if(e!=2&&e!=3){

           bool as= e==1;

           bool bs= b==2;

           bool cs= a==5;

           bool ds= c!=1;

           bool es= d==1;

           if(as+bs+cs+ds+es==2){

               if(a+b==3&&as*bs==1||...){

                   cout<<ans;

               }

           }

       }

   }

}}}}}


枚举算法的概念:

1、列出所有可能性

2、通过条件筛选出正确答案

枚举算法又称暴力搜索

枚举算法的限制:

1、不能列出所有可能性,或可能性太多的情况

2、条件无法直接表示出来


int n,a[1000000];

cin>>n;

for(int i=1;i<=n;i++){

   cin>>a[i];

}

sort(a+1,a+n+1);

for(int i=1;i<n-1;i++){

   for(int j=i+1;j<n;j++){

       for(int k=j+1;k<=n;k++){

           if(a[i]+a[j]==a[k]){


           }

       }

   }

}

for(int k=n;k>2;k--){

   bool f=false;

   for(int j=k-1;j>1;j--){

       if(f) break;

       for(int i=j-1;i>0;i--){

           if(f) break;

           if(a[k]==a[i]+a[j]){

               f=true;

               ans++;

           }

       }

   }

}


二分法(二分法,快速排序,归并排序)


输入n

输入n个数字

输入m

输出在n个数字中是否有m

n<10^9


二分法流程:

1、排序

int n;

cin>>n;

for(int i=1;i<=n;i++){

   cin>>a[i];

}

sort(a+1,a+n+1);

2、从中间开始找

情况一:数据范围的中间

情况二:数组下标的中间

int l=1,r=n;

while(l<r){

   int mid=(l+r)/2;

   if(a[mid]==m){

       存在

   }

   else if(a[mid]>m){

       r=mid-1;

   }

   else {

       l=mid+1;

   }

}

不存在



输入n

输入n个数字

输入m

输出在n个数字中是否有m,存在输出m的下标,不存在输出-1

n<10^9

struct node{

   int num;

   int id;

} a[1000000];

bool cmp(node a,node b){

   return a.num<b.num;

}

int n;

cin>>n;

for(int i=1;i<=n;i++){

   cin>>a[i].num;

   a[i].id=i;

}

sort(a+1,a+n+1,cmp);

2、从中间开始找

情况一:数据范围的中间

情况二:数组下标的中间

int l=1,r=n;

while(l<r){

   int mid=(l+r)/2;

   if(a[mid].num==m){

       ans=a[mid].id;

   }

   else if(a[mid].num>m){

       r=mid-1;

   }

   else {

       l=mid+1;

   }

}

ans=-1;


作业:图书馆问题1415,输出前k大的数1235,跳石头1890

(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%