★★比赛新机制★★
题解:递推
sum=a1+a2+...an
如果顺序为a1,a2,a2...an,那么罚时为S1=n*a1+(n-1)*a2+(n-2)*a3....+an
如果顺序为a2,a3....,an,a1,那么罚时为S2=n*a2+(n-1)*a3+....a1
即Si+1=S1-n*ai+sum.
O(N)
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define LL long long int T; LL s[500003]; LL tmp,ans,sum; int main() { scanf("%d",&T); while(T--) { int n; scanf("%d",&n); tmp=0;sum=0; for(int i=1;i<=n;i++) { scanf("%lld",&s[i]); sum+=s[i]; tmp+=(n-i+1)*s[i]; } ans=tmp; for(int i=1;i<=n;i++) { ans=min(ans,tmp-n*s[i]+sum); tmp=tmp-n*s[i]+sum; } tmp=0; for(int i=n;i>=1;i--) { tmp+=i*s[i]; } ans=min(ans,tmp); for(int i=n;i>=1;i--) { ans=min(ans,tmp-n*s[i]+sum); tmp=tmp-n*s[i]+sum; } printf("%lld ",ans); } return 0; }
★★生命的游戏★★
模拟
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int T; int n,k; int a[101][101],b[101][101],c[101][101]; int js1,js; int dx[]={0,0,1,1,1,-1,-1,-1}; int dy[]={1,-1,0,-1,1,0,1,-1}; bool check() { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(a[i][j]!=b[i][j]) return false; } } return true; } int count_alivecell(int x,int y) { int res=0; for(int i=0;i<8;i++) { int nowx=(x+dx[i]+n)%n; int nowy=(y+dy[i]+n)%n; if(a[nowx][nowy]) res++; } return res; } void slove() { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { c[i][j]=a[i][j]; } } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { int cnt=count_alivecell(i,j); if(a[i][j]) { if(cnt>3||cnt<2) c[i][j]=0,js1--; }else { if(cnt==3) c[i][j]=1,js1++; } } } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { a[i][j]=c[i][j]; } } } int main() { scanf("%d",&T); while(T--) { scanf("%d%d",&n,&k); js1=0; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { scanf("%d",&a[i][j]); b[i][j]=a[i][j]; if(a[i][j]) js1++; } } js=js1; bool flag=false; for(int i=1;i<=k;i++) { slove(); // for(int j=0;j<n;j++) // { /// for(int kk=0;kk<n;kk++) // { // cout<<a[j][kk]<<"--"; // } // cout<<endl; // } if(js1==js&&check()) { flag=true; printf("YES %d ",i); break; } } if(!flag) printf("NO "); } return 0; }
★★飞马分隔符★★
栈
#include<iostream> #include<cstdio> using namespace std; char s[100002]; char stac[100002]; int top; int main() { int t; scanf("%d",&t); while(t--) { int n,ans=0; top=0; scanf("%d",&n); scanf("%s",s+1); for(int i=1;i<=n;i++) { if(s[i]=='F'&&!top) stac[++top]='F'; if(s[i]=='e'&&stac[top]=='F') stac[++top]='e'; if(s[i]=='i'&&stac[top]=='e') stac[++top]='i'; if(s[i]=='M'&&stac[top]=='i') stac[++top]='M'; if(s[i]=='a'&&stac[top]=='M') ans++,top=0; } cout<<ans<<endl; } return 0; }
★★温暖的力量★★
题目大意:x能否被质数的和表示,若能,能被几个质数表示。
题解:
当 n为大于3的奇数时,可以分为若干个2和一个3当n为大于3的偶数时,可以分为若干个2。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int T; int s[1000002]; int main() { scanf("%d",&T); while(T--) { int x; scanf("%d",&x); if(x<=3) printf("-1 "); else printf("%d ",x/2); } return 0; }
★★平形四边行★★
四个点能形成“平形四边行”的充要条件是,存在一种方案,将四个点均分为两组,每组的两个点形成一条线段,这两条线段的中点重合。
#include<iostream> #include<map> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 100001 int xx[N],yy[N]; struct Node { int x,y; Node(){}//.... Node(int x,int y): x(x),y(y){} bool operator!=(const Node& t) { return x!=t.x&&x!=t.y&&y!=t.x&&y!=t.y; } }; map<pair<int,int>,Node>mp; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&xx[i],&yy[i]); } for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { int tx=xx[i]+xx[j]; int ty=yy[i]+yy[j]; if(!mp.count({tx,ty})) { mp[{tx,ty}]=Node(i,j); }else if(mp[{tx,ty}]!=Node(i,j)) { puts("YES"); printf("%d %d %d %d ",i,j,mp[{tx,ty}].x,mp[{tx,ty}].y); return 0; } } } printf("NO"); return 0; }
★★翻滚吧硬币★★
只要知道硬币翻滚的距离是圆心移动的距离就好办
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define LL long long using namespace std; int T; int main() { scanf("%d",&T); while(T--) { LL a[4]; for(int i=1;i<=3;i++) scanf("%lld",&a[i]); sort(a+1,a+3+1); LL l1,l2,l3; l1=a[1]+a[2]; l2=a[1]+a[3]; l3=a[2]+a[3]; double z=1.*(l1*l1+l2*l2-l3*l3)/(2*l1*l2); double p=1.*(l1*l1+l3*l3-l2*l2)/(2*l1*l3); z=z*-1.;p=p*-1.; z=acos(z); p=acos(p); double ans=l2*z+l3*p; ans=ans*2/(3.14159265358979323*2*a[3]); printf("%.15lf ",ans); } return 0; }