结构体类型:将一类事物总结成的类型 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) |