1537:水题,排序贪心

#include<cstdio> #include<cstring> #include<algorithm> #define maxn 1009 using namespace std; int num[maxn]; int tmp[maxn]; int b[maxn]; int main() { int n; while(scanf("%d",&n)&&n) { for(int i=1;i<=n;i++) scanf("%d%d",&num[i],&b[i]); int ret=0,ans; for(int i=0;i<=n;i++) { for(int j=1;j<=n;j++) { tmp[j]=num[j]-i*b[j]; } ans=0; sort(tmp+1,tmp+n+1); for(int j=n;j>n-i;j--) ans+=tmp[j]; ret=max(ret,ans); } printf("%d ",ret); } return 0; }
1538:贪心+dp

#include<cstdio> #include<cstring> #include<algorithm> #define maxn 1009 using namespace std; struct node { int a,b; bool operator<(const node &t)const { if(b==t.b)return a>t.a; return b>t.b; } }num[maxn]; int f[maxn][maxn]; int main() { int n; while(scanf("%d",&n)&&n) { for(int i=1;i<=n;i++) scanf("%d%d",&num[i].a,&num[i].b); sort(num+1,num+n+1); memset(f,0,sizeof f); for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { f[i][j]=max(f[i-1][j-1]+num[i].a-(j-1)*num[i].b,f[i-1][j]); } } int ans=0; for(int i=1;i<=n;i++) ans=max(ans,f[n][i]); printf("%d ",ans); } return 0; }
1540:

#include <iostream> #include<stdio.h> #include <cstring> #define ll long long #define mod 1000000007 using namespace std; struct Mat { ll mat[2][2]; } N,E; Mat operator*(Mat a,Mat b) { Mat c; memset(c.mat,0,sizeof c.mat); for (int i=0; i<2; i++) for (int j=0; j<2; j++) for (int k=0; k<2; k++) { if (a.mat[i][k] && b.mat[k][j]) { c.mat[i][j]+=(a.mat[i][k]*b.mat[k][j])%mod; c.mat[i][j]%=mod; } } return c; } Mat operator^(Mat a,ll x) { Mat c=E; for (; x; x>>=1) { if (x&1) c=c*a; a=a*a; } return c; } void init() { N.mat[0][0]=N.mat[0][1]=1; N.mat[1][0]=1; N.mat[1][1]=0; memset(E.mat,0,sizeof E.mat); E.mat[0][0]=E.mat[1][1]=1; } ll extenclid(ll d,ll f) { ll x1,x2,x3,y1,y2,y3,t1,t2,t3,k; if(d>f) d=d+f-(d=f); x1=1,x2=0,x3=f; y1=0,y2=1,y3=d; while(1) { if(y3==0) return 0; if(y3==1) return y2; k=x3/y3; t1=(x1-k*y1+2*mod)%(2*mod), t2=(x2-k*y2+2*mod)%(2*mod), t3=(x3-k*y3+2*mod)%(2*mod); x1=y1,x2=y2,x3=y3; y1=t1,y2=t2,y3=t3; } } int main() { ll n; while(scanf("%I64d",&n)&&n) { init(); n--; ll ret=0; Mat ans=N^n; ll tmp1=ans.mat[0][1]; ll tmp2=ans.mat[0][0]; ll tmp3=(tmp1+tmp2)%mod; if(n%2)tmp1=-tmp1; ret=(((tmp3*tmp3)%mod)*tmp2+tmp1+1+mod)%mod; ll x=extenclid(2,mod); ret=ret*x%mod; cout<<ret<<endl; } return 0; }
1542:并查集+floyd

#include<cstdio> #include<cstring> #define maxn 100009 #define inf 1<<30 using namespace std; struct egde { int f,to; int value; } eg[maxn]; int f[maxn]; int find(int x) { return x==f[x]?x:f[x]=find(f[x]); } void un(int x,int y) { int a=find(x); int b=find(y); if(a!=b) { f[a]=b; } } int mat[205][205]; int ding[maxn]; int toding[maxn]; void floyd(int num) { for(int k=0; k<num; k++) { for(int i=0; i<num; i++) { for(int j=0; j<num; j++) { if(i==j)continue; if(mat[i][k]>=inf||mat[k][j]>=inf)continue; if(mat[i][j]>=inf||(mat[i][j]>mat[i][k]+mat[k][j])) { mat[i][j]=mat[i][k]+mat[k][j]; } } } } } int main() { int n,m; int x,y,v; while(scanf("%d",&n)&&n) { memset(toding,0,sizeof toding); for(int i=0; i<204; i++) for(int j=0; j<204; j++) { //if (i==j) mat[i][j]=0; mat[i][j]=inf; } scanf("%d",&m); for(int i=1; i<=n; i++)f[i]=i; for(int i=0; i<m; i++) { scanf("%d%d%d",&x,&y,&v); eg[i].f=x; eg[i].to=y; eg[i].value=v; if(v==0) un(x,y); } int cnt=0; for(int i=1; i<=n; i++) if(f[i]==i) { ding[cnt]=i; toding[i]=cnt++; } for(int i=0; i<m; i++) { x=find(eg[i].f); y=find(eg[i].to); if(x==y) continue; x=toding[x]; y=toding[y]; if(mat[x][y]>eg[i].value) { mat[x][y]=mat[y][x]=eg[i].value; } } floyd(cnt); // for(int i=0;i<cnt;i++) // { // for(int j=0;j<cnt;j++) // printf("%d ",mat[i][j]); // puts(""); // } int q; scanf("%d",&q); while(q--) { scanf("%d%d",&x,&y); x=find(x); y=find(y); if(x==y)printf("0 "); else { x=toding[x]; y=toding[y]; if(mat[x][y]>=inf)puts("-1"); else printf("%d ",mat[x][y]); } } } return 0; } /* 6 7 1 2 5 1 3 0 1 4 10 4 5 2 3 4 3 5 6 1 4 6 8 9 1 4 1 5 4 6 */
1545:直接手推

#include <iostream> #include<stdio.h> using namespace std; int main() { printf("13 "); return 0; }
1546:bfs+状态压缩dp

#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<cstring> #define inf 1<<30 #define maxn 1<<12 using namespace std; int dp[maxn][14]; int ff[maxn][14]; int w,h,l,m,n; char s[55][55]; int dis[13][13]; int num[13]; bool vis[55][55]; struct node { int x,y; int d; node(int x,int y,int d):x(x),y(y),d(d) {} }; queue<node>q; void bfs(int x,int y) { int in=s[x][y]-'a'; while(!q.empty())q.pop(); node u=node(x,y,0); vis[x][y]=1; q.push(u); while(!q.empty()) { u=q.front(); if(s[u.x][u.y]>='a'&&s[u.x][u.y]<='z') dis[in][s[u.x][u.y]-'a']=u.d; node v(0,0,0); q.pop(); if(u.x+1<h&&!vis[u.x+1][u.y]&&s[u.x+1][u.y]!='#') { vis[u.x+1][u.y]=1; v=node(u.x+1,u.y,u.d+1); q.push(v); } if(u.x-1>=0&&!vis[u.x-1][u.y]&&s[u.x-1][u.y]!='#') { vis[u.x-1][u.y]=1; v=node(u.x-1,u.y,u.d+1); q.push(v); } if(u.y+1<w&&!vis[u.x][u.y+1]&&s[u.x][u.y+1]!='#') { vis[u.x][u.y+1]=1; v=node(u.x,u.y+1,u.d+1); q.push(v); } if(u.y-1>=0&&!vis[u.x][u.y-1]&&s[u.x][u.y-1]!='#') { vis[u.x][u.y-1]=1; v=node(u.x,u.y-1,u.d+1); q.push(v); } } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d%d%d%d",&w,&h,&l,&m,&n); for(int i=1; i<=m; i++) scanf("%d",&num[i]); for(int i=0;i<m+2;i++) { for(int j=0;j<m+2;j++) dis[i][j]=inf; } int cnt=1; for(int i=0; i<h; i++) { scanf("%s",s[i]); for(int j=0; j<w; j++) { if(s[i][j]=='@') s[i][j]=(cnt++)+'a'; else if(s[i][j]=='$') s[i][j]='a'; else if(s[i][j]=='<') s[i][j]=(m+1)+'a'; } } for(int i=0; i<h; i++) { for(int j=0; j<w; j++) { if(s[i][j]>='a'&&s[i][j]<='z') { memset(vis,0,sizeof vis); bfs(i,j); // printf("%d---- ",s[i][j]-'a'); } } } // for(int i=0;i<=m+1;i++) // { // for(int j=0;j<=m+1;j++) // { // printf("%d ",dis[i][j]); // } // puts(""); // } int ret=0; for(int i=1; i<=m; i++) if(dis[0][i]<=l/2) { ret+=num[i]; num[i]=0; } int ans=0; memset(dp,-1,sizeof dp); memset(ff,0,sizeof ff); for(int i=0; i<m; i++) { ff[1<<i][i+1]=dis[0][i+1]; if(dis[0][i+1]<=(l-dis[i+1][m+1])) { dp[1<<i][i+1]=num[i+1]; ans=max(ans,num[i+1]); } } // for(int i=1; i<(1<<m); i++) // { // for(int j=1; j<=m; j++) // printf("%d ",dp[i][j]); // puts(""); // } for(int i=1; i<(1<<m); i++) { for(int j=1; j<=m; j++) { int td=dis[j][m+1]; if((i&(1<<(j-1)))==0) continue; int tmp=i-(1<<(j-1)); if(tmp==0)continue; for(int k=1; k<=m; k++) { if(dp[tmp][k]==-1)continue; if((tmp&(1<<(k-1)))==0)continue; if(ff[tmp][k]+dis[k][j]<=(l-td)) { if(dp[i][j]==-1) { dp[i][j]=dp[tmp][k]+num[j]; ff[i][j]=ff[tmp][k]+dis[k][j]; } else if(dp[i][j]>dp[tmp][k]+num[j]) { dp[i][j]=dp[tmp][k]+num[j]; ff[i][j]=ff[tmp][k]+dis[k][j]; } } } ans=max(dp[i][j],ans); } } // printf("%d %d ",ans,ret); if(ans+ret<n||dis[0][m+1]>l) puts("NO"); else puts("YES"); } return 0; } /* 3 8 7 6 6 1000 100 200 300 400 200 200 ####@### ........ ........ ...$...@ @@...... <@@..... ######## */