模拟
开个struct排序即可 c++吼啊
1 /*by SilverN*/ 2 #include3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 const int mxn=100010;10 int read(){11 int x=0,f=1;char ch=getchar();12 while(ch<'0' || ch>'9'){ if(ch=='-')f=-1;ch=getchar();}13 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}14 return x*f;15 }16 struct stu{17 int ch,ma,en;18 int tot;19 int id;20 }s[300];21 int cmp(stu a,stu b){22 if(a.tot!=b.tot)return a.tot>b.tot;23 if(a.ch!=b.ch)return a.ch>b.ch;24 return a.id
贪心
价值从小到大排序。每次把最大的和最小的组合在一起(如果不能组合,那么最大的单独成为一组)
1 /*by SilverN*/ 2 #include3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 const int mxn=30010;10 int read(){11 int x=0,f=1;char ch=getchar();12 while(ch<'0' || ch>'9'){ if(ch=='-')f=-1;ch=getchar();}13 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}14 return x*f;15 }16 int w,n;17 int p[mxn];18 int main(){19 w=read();n=read();20 int i,j;21 for(i=1;i<=n;i++) p[i]=read();22 sort(p+1,p+n+1);23 int hd=1,tl=n;24 int cnt=0;25 while(hd<=tl){26 if(p[hd]+p[tl]<=w)cnt++,hd++,tl--;27 else tl--,cnt++;28 }29 printf("%d\n",cnt);30 return 0;31 }
DP
能闪则闪。不能闪的时候,同时处理原地回蓝和一直跑两个状态,如果回蓝后闪烁比跑的距离更远,就更新距离。
1 /*by SilverN*/ 2 #include3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 const int mxn=100010;10 int m,s,t;11 int main(){12 scanf("%d%d%d",&m,&s,&t);13 int i,j;14 int now=0;15 int tst=0;16 for(i=1;i<=t;i++){17 if(m>=10){18 tst+=60;19 m-=10;20 }21 else m+=4;22 if(tst>now+17)now=tst;23 else now+=17;24 if(now>=s)break;25 }26 if(i>t)printf("No\n%d\n",now);27 else printf("Yes\n%d\n",i);28 return 0;29 }
普通的汉诺塔方案数是f(n)=2^n-1
这里因为两个盘等价,方案数直接乘2变成2^(n+1)-2
一个高精乘单精就可以解决,之后末尾直接-2 (因为2的次方数,个位只能是2 4 6 8的一种,所以不需要借位)
1 /*by SilverN*/ 2 #include3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 const int mxn=10001;10 int len=1;11 int a[mxn];12 int main(){13 int i,j,n;14 scanf("%d",&n);15 a[1]=1;16 for(i=0;i<=n;i++){17 for(j=len;j;j--){18 a[j]*=2;19 a[j+1]+=a[j]/10;20 a[j]%=10;21 }22 if(a[len+1]) ++len;23 }24 a[1]-=2;25 for(i=len;i;i--)printf("%d",a[i]);26 printf("\n");27 return 0;28 }