A. Toda 2

按题意模拟即可。

  1. #include <bits/stdc++.h>
  2. using namespace std ;
  3.  
  4. typedef pair < int , int > pii ;
  5.  
  6. #define clr( a , x ) memset ( a , x , sizeof a )
  7.  
  8. const int MAXN = 105 ;
  9.  
  10. pii a[MAXN] ;
  11. int G[MAXN * MAXN][MAXN] ;
  12. int n , x ;
  13.  
  14. void solve () {
  15. int minv = MAXN ;
  16. clr ( G , 0 ) ;
  17. for ( int i = 1 ; i <= n ; ++ i ) {
  18. scanf ( "%d" , &x ) ;
  19. a[i] = pii ( x , i ) ;
  20. }
  21. int cnt = 0 ;
  22. while ( 1 ) {
  23. sort ( a + 1 , a + n + 1 ) ;
  24. if ( a[1].first == a[n].first ) break ;
  25. int m = 0 ;
  26. ++ cnt ;
  27. for ( int i = 1 ; i <= n ; ++ i ) {
  28. if ( a[i].first > a[1].first ) ++ m ;
  29. }
  30. if ( m > 1 && m <= 5 && a[n].first - 1 == a[1].first ) {
  31. for ( int i = n - m + 1 ; i <= n ; ++ i ) {
  32. a[i].first -- ;
  33. G[cnt][a[i].second] = 1 ;
  34. }
  35. break ;
  36. } else {
  37. if ( a[n].first ) a[n].first -- ;
  38. if ( a[n - 1].first ) a[n - 1].first -- ;
  39. G[cnt][a[n].second] = G[cnt][a[n - 1].second] = 1 ;
  40. }
  41. }
  42. printf ( "%d\n" , a[1].first ) ;
  43. printf ( "%d\n" , cnt ) ;
  44. for ( int i = 1 ; i <= cnt ; ++ i ) {
  45. for ( int j = 1 ; j <= n ; ++ j ) {
  46. printf ( "%d" , G[i][j] ) ;
  47. }
  48. puts ( "" ) ;
  49. }
  50. }
  51.  
  52. int main () {
  53. while ( ~scanf ( "%d" , &n ) ) solve () ;
  54. return 0 ;
  55. }

  

B. Minimum and Maximum

首先将1和2,3和4,5和6,...两两比较,得到较大值和较小值,再在这$\lceil\frac{n}{2}\rceil$对中大的比大的,小的比小的即可。

  1. #include <bits/stdc++.h>
  2. using namespace std ;
  3.  
  4. typedef pair < int , int > pii ;
  5.  
  6. #define clr( a , x ) memset ( a , x , sizeof a )
  7.  
  8. const int MAXN = 105 ;
  9.  
  10. pii a[MAXN] ;
  11.  
  12. void solve () {
  13. int cnt = 0 , n ;
  14. scanf ( "%d" , &n ) ;
  15. for ( int i = 1 ; i < n ; i += 2 ) {
  16. printf ( "? %d %d\n" , i , i + 1 ) ;
  17. fflush ( stdout ) ;
  18. char op[5] ;
  19. scanf ( "%s" , op ) ;
  20. if ( op[0] == '<' ) a[++ cnt] = pii ( i , i + 1 ) ;
  21. else a[++ cnt] = pii ( i + 1 , i ) ;
  22. }
  23. if ( n & 1 ) a[++ cnt] = pii ( n , n ) ;
  24. for ( int i = 1 ; i < cnt ; ++ i ) {
  25. printf ( "? %d %d\n" , a[i].first , a[i + 1].first ) ;
  26. fflush ( stdout ) ;
  27. char op[5] ;
  28. scanf ( "%s" , op ) ;
  29. if ( op[0] == '<' ) a[i + 1].first = a[i].first ;
  30. printf ( "? %d %d\n" , a[i].second , a[i + 1].second ) ;
  31. fflush ( stdout ) ;
  32. scanf ( "%s" , op ) ;
  33. if ( op[0] == '>' ) a[i + 1].second = a[i].second ;
  34. }
  35. printf ( "! %d %d\n" , a[cnt].first , a[cnt].second ) ;
  36. fflush ( stdout ) ;
  37. }
  38.  
  39. int main () {
  40. int T ;
  41. scanf ( "%d" , &T ) ;
  42. while ( T -- ) solve () ;
  43. return 0 ;
  44. }

  

C. Bulmart

首先BFS求出任意两点间的最短路,然后将物品按照单价从小到大排序。

对于每个询问,二分答案,然后$O(w)$检验即可。

时间复杂度$O(n(n+m)+qw\log n)$。

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. typedef long long ll;
  5. const int N=5010;
  6. int n,m,Q,i,x,y,g[N],v[N<<1],nxt[N<<1],ed;
  7. int q[N],h,t,d[N][N];
  8. struct P{int c,k,p;}a[N];
  9. inline bool cmp(const P&a,const P&b){return a.p<b.p;}
  10. inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
  11. inline void bfs(int S){
  12. int i,x;
  13. for(i=1;i<=n;i++)d[S][i]=-1;
  14. q[h=t=1]=S;
  15. d[S][S]=0;
  16. while(h<=t)for(i=g[x=q[h++]];i;i=nxt[i])if(d[S][v[i]]<0)d[S][q[++t]=v[i]]=d[S][x]+1;
  17. }
  18. inline bool check(int S,int R,int M,int dis){
  19. int t;
  20. for(int i=1;i<=m;i++)if(d[S][a[i].c]<=dis&&d[S][a[i].c]>=0){
  21. int t=min(R,a[i].k);
  22. if(1LL*t*a[i].p>M)return 0;
  23. R-=t;
  24. M-=t*a[i].p;
  25. if(!R)return 1;
  26. }
  27. return 0;
  28. }
  29. inline int ask(){
  30. int S,R,M;
  31. scanf("%d%d%d",&S,&R,&M);
  32. int l=0,r=n-1,mid,t=-1;
  33. while(l<=r){
  34. mid=(l+r)>>1;
  35. if(check(S,R,M,mid))r=(t=mid)-1;else l=mid+1;
  36. }
  37. return t;
  38. }
  39. int main(){
  40. scanf("%d%d",&n,&m);
  41. while(m--)scanf("%d%d",&x,&y),add(x,y),add(y,x);
  42. for(i=1;i<=n;i++)bfs(i);
  43. scanf("%d",&m);
  44. for(i=1;i<=m;i++)scanf("%d%d%d",&a[i].c,&a[i].k,&a[i].p);
  45. sort(a+1,a+m+1,cmp);
  46. scanf("%d",&Q);
  47. while(Q--)printf("%d\n",ask());
  48. return 0;
  49. }

  

D. Running Over The Bridges

贪心,当且仅当再不嗑药就过不了桥的时候嗑药。

时间复杂度$O(n)$。

  1. #include<stdio.h>
  2. #include<algorithm>
  3. #include<math.h>
  4. #include<string.h>
  5. #include<string>
  6. #include<vector>
  7. #include<set>
  8. #include<map>
  9. #include<queue>
  10. #include<time.h>
  11. #include<assert.h>
  12. #include<iostream>
  13. using namespace std;
  14. typedef long long LL;
  15. typedef pair<int,int>pi;
  16. const int LIM=100001;
  17. const int Maxn=200020;
  18. int l[Maxn],t[Maxn];
  19. int n;
  20. LL r;
  21. vector<LL>res;
  22. LL solve(){
  23. for(int i=1;i<=n;i++)if(l[i]>t[i])return -1;
  24. LL curt=0,rest=0,ret=0;
  25. for(int i=1;i<=n;i++){
  26. if(rest>=l[i]){
  27. rest-=l[i];
  28. curt+=l[i];
  29. continue;
  30. }
  31. l[i]-=rest;t[i]-=rest;
  32. curt+=rest;
  33. rest=0;
  34. if(t[i]>=2*l[i]){
  35. curt+=2*l[i];
  36. }
  37. else{
  38. LL x=t[i]-l[i];
  39. curt+=2*x;
  40. LL restl=l[i]-x;
  41. LL ned=restl/r;
  42. if(restl%r)ned++;
  43. ret+=ned;
  44. LL tmp=0;
  45. //printf("tmp=%lld\n",tmp);
  46. while(res.size()<LIM){
  47. res.push_back(curt+tmp);
  48. if(tmp+r<restl)tmp+=r;
  49. else{
  50. break;
  51. }
  52. }
  53. curt+=restl;
  54. rest=r-restl%r;
  55. if(rest==r)rest=0;
  56. }
  57. }
  58. return ret;
  59. }
  60. int main(){
  61. while(scanf("%d%lld",&n,&r)!=EOF){
  62. res.clear();
  63. for(int i=1;i<=n;i++)scanf("%d",l+i);
  64. for(int i=1;i<=n;i++)scanf("%d",t+i);
  65. LL ans=solve();
  66. if(ans<0){
  67. puts("-1");
  68. }
  69. else{
  70. printf("%lld\n",ans);
  71. if(!res.size()||res.size()>LIM-1)puts("");
  72. else{
  73. for(int i=0;i<res.size();i++)
  74. printf("%lld%c",res[i],i==res.size()-1?'\n':' ');
  75. }
  76. }
  77. }
  78. return 0;
  79. }

  

E. Award Ceremony

枚举两个队伍,看看谁先揭榜对答案贡献更大,即可得到拓扑序,然后模拟即可。

时间复杂度$O(n^2)$。

  1. #include<stdio.h>
  2. #include<algorithm>
  3. #include<math.h>
  4. #include<string.h>
  5. #include<string>
  6. #include<vector>
  7. #include<set>
  8. #include<map>
  9. #include<queue>
  10. #include<time.h>
  11. #include<assert.h>
  12. #include<iostream>
  13. using namespace std;
  14. typedef long long LL;
  15. typedef pair<int,int>pi;
  16. const int Maxn=300;
  17. int n;
  18. int a[Maxn],b[Maxn];
  19. pi V1[Maxn],V2[Maxn];
  20. pi rev1[Maxn],rev2[Maxn];
  21. int deg[Maxn];
  22. vector<int>res;
  23. vector<int>G[Maxn];
  24. int rk[Maxn],nxtrk[Maxn];
  25. pi cur[Maxn];
  26. void solve(){
  27. res.clear();
  28. for(int i=1;i<=n;i++)deg[i]=0;
  29. for(int i=1;i<=n;i++){
  30. for(int j=0;j<G[i].size();j++)deg[G[i][j]]++;
  31. }
  32. queue<int>q;
  33. for(int i=1;i<=n;i++)if(!deg[i])q.push(i);
  34. while(!q.empty()){
  35. int u=q.front();q.pop();
  36. res.push_back(u);
  37. for(int i=0;i<G[u].size();i++){
  38. int v=G[u][i];
  39. deg[v]--;
  40. if(!deg[v])q.push(v);
  41. }
  42. }
  43. }
  44. int check(int u,int v){
  45. int ret=0;
  46. if(rev1[u]<rev1[v]){
  47. if(rev2[u]<rev1[v]){
  48. if(rev2[u]<rev2[v]);
  49. else ret++;
  50. }
  51. else{
  52. ret++;
  53. if(rev2[u]>rev2[v]);
  54. else ret++;
  55. }
  56. }
  57. else{
  58. if(rev2[u]>rev1[v]){
  59. if(rev2[u]>rev2[v]);
  60. else ret++;
  61. }
  62. else{
  63. ret++;
  64. if(rev2[u]<rev2[v]);
  65. else ret++;
  66. }
  67. }
  68. return ret;
  69. }
  70. int main(){
  71. scanf("%d",&n);
  72. for(int i=1;i<=n;i++)scanf("%d%d",a+i,b+i),b[i]+=a[i];
  73. for(int i=1;i<=n;i++)rev1[i]=pi(-a[i],i),rev2[i]=pi(-b[i],i);
  74. for(int i=1;i<=n;i++)G[i].clear();
  75. for(int i=1;i<=n;i++){
  76. for(int j=i+1;j<=n;j++){
  77. int t1=check(i,j),t2=check(j,i);
  78. if(t1!=t2){
  79. if(t1>t2){
  80. G[i].push_back(j);
  81. }
  82. else G[j].push_back(i);
  83. }
  84. }
  85. }
  86. solve();
  87.  
  88. for(int i=1;i<=n;i++)cur[i]=pi(-a[i],i);
  89.  
  90. sort(cur+1,cur+n+1);
  91. for(int i=1;i<=n;i++){
  92. // printf("val=%d sd=%d\n",cur[i].first,cur[i].second);
  93. rk[cur[i].second]=i;
  94. }
  95. //for(int i=1;i<=n;i++)printf("%d ",rk[i]);puts("");
  96. int ans=0;
  97. for(int i=0;i<n;i++){
  98. int cs=res[i];
  99. for(int j=1;j<=n;j++)if(cur[j].second==cs)cur[j].first=-b[cs];
  100. sort(cur+1,cur+n+1);
  101. for(int j=1;j<=n;j++)nxtrk[cur[j].second]=j;
  102. ans+=abs(nxtrk[cs]-rk[cs]);
  103. for(int j=1;j<=n;j++)rk[j]=nxtrk[j];
  104. //printf("cs=%d ans=%d\n",cs,ans);
  105. }
  106. printf("%d\n",ans);
  107. return 0;
  108. }

  

F. Ber Patio

设$dp[i][j]$表示买了前$i$个物品,目前送了$j$张代金券时,最少要花多少钱,$s[i]$表示前$i$个物品的价值总和。

那么已知$i,j,dp[i][j],s[i]$,当前手上剩余代金券的总量等于$b+j-(s[i]-dp[i][j])$,所以不需要记录代金券总量,枚举要用多少代金券转移即可。

状态数$O(\frac{n\sum a}{10})$。

时间复杂度$O(\frac{n\sum a}{4})$。

  1. #include<stdio.h>
  2. #include<algorithm>
  3. #include<math.h>
  4. #include<string.h>
  5. #include<string>
  6. #include<vector>
  7. #include<set>
  8. #include<map>
  9. #include<queue>
  10. #include<time.h>
  11. #include<assert.h>
  12. #include<iostream>
  13. using namespace std;
  14. typedef long long LL;
  15. typedef pair<int,int>pi;
  16. const int Maxn=5050,Maxstate=10020,Inf=1e9;
  17. int n,b;
  18. int a[Maxn],sum[Maxn];
  19. int dp[2][10020];
  20. short pre[Maxn][Maxstate];
  21. void init(int cs){
  22. for(int i=0;i<Maxstate;i++)dp[cs][i]=Inf;
  23. }
  24. int main(){
  25. scanf("%d%d",&n,&b);
  26. for(int i=1;i<=n;i++)scanf("%d",a+i),sum[i]=sum[i-1]+a[i];
  27. int cs=0;
  28. init(0);init(1);
  29. dp[0][0]=0;
  30. for(int i=1;i<=n;i++,cs^=1){
  31. init(cs^1);
  32. for(int j=0;j<Maxstate;j++){
  33. if(dp[cs][j]==Inf)continue;
  34. int w=dp[cs][j];
  35. int total=sum[i-1];
  36. int rest=b+j-(total-w);
  37. for(int k=0;k<=rest&&k<=a[i]/2;k++){
  38. int nw=w+a[i]-k;
  39. int nj=j+(a[i]-k)/10;
  40. if(dp[cs^1][nj]>nw){
  41. dp[cs^1][nj]=nw;
  42. pre[i][nj]=a[i]-k;
  43. }
  44. }
  45. }
  46. }
  47. int ans=Inf,cur=-1;
  48. for(int i=0;i<Maxstate;i++)if(dp[cs][i]<ans){cur=i;ans=dp[cs][i];}
  49. printf("%d\n",ans);
  50. vector<int>rep;
  51. for(int i=n;i>0;i--){
  52. rep.push_back(pre[i][cur]);
  53. cur=cur-pre[i][cur]/10;
  54. }
  55. reverse(rep.begin(),rep.end());
  56. for(int i=0;i<rep.size();i++)printf("%d%c",a[i+1]-rep[i],i==rep.size()-1?'\n':' ');
  57. return 0;
  58. }

  

G. Car Repair Shop

按题意模拟即可。

时间复杂度$O(n^2\log n)$。

  1. #include <bits/stdc++.h>
  2. using namespace std ;
  3.  
  4. typedef pair < int , int > pii ;
  5.  
  6. #define clr( a , x ) memset ( a , x , sizeof a )
  7.  
  8. const int MAXN = 10005 ;
  9.  
  10. int n ;
  11. vector < pii > G ;
  12.  
  13. void solve () {
  14. G.clear () ;
  15. G.push_back ( pii ( 1 , 2e9 ) ) ;
  16. for ( int i = 1 ; i <= n ; ++ i ) {
  17. sort ( G.begin () , G.end () ) ;
  18. int l , r , d , ok = 0 ;
  19. scanf ( "%d%d" , &l , &d ) ;
  20. r = l + d - 1 ;
  21. for ( int j = 0 ; j < G.size () ; ++ j ) {
  22. if ( G[j].first <= l && r <= G[j].second ) {
  23. ok = 1 ;
  24. printf ( "%d %d\n" , l , r ) ;
  25. int l1 = G[j].first , r1 = l - 1 ;
  26. int l2 = r + 1 , r2 = G[j].second ;
  27. G[j] = pii ( l1 , r1 ) ;
  28. if ( l2 <= r2 ) G.push_back ( pii ( l2 , r2 ) ) ;
  29. break ;
  30. }
  31. }
  32. if ( ok ) continue ;
  33. for ( int j = 0 ; j < G.size () ; ++ j ) {
  34. if ( G[j].second - G[j].first + 1 >= d ) {
  35. printf ( "%d %d\n" , G[j].first , G[j].first + d - 1 ) ;
  36. G[j].first += d ;
  37. break ;
  38. }
  39. }
  40. }
  41. }
  42.  
  43. int main () {
  44. while ( ~scanf ( "%d" , &n ) ) solve () ;
  45. return 0 ;
  46. }

  

H. Delete Them

对于每一位,如果要删的串这一位都相同,那么就是这个字符,否则必须是'?',然后检验是否合法即可。

时间复杂度$O(n^2)$。

  1. #include<cstdio>
  2. #include<cstring>
  3. const int N=200;
  4. int n,m,L,i,j,len[N],b[N],v[N];char a[N][N],s[N];
  5. inline bool check(int x){
  6. if(len[x]!=L)return 0;
  7. for(int i=0;i<L;i++)if(s[i]!='?'&&s[i]!=a[x][i])return 0;
  8. return 1;
  9. }
  10. int main(){
  11. scanf("%d%d",&n,&m);
  12. for(i=1;i<=n;i++){
  13. scanf("%s",a[i]);
  14. len[i]=strlen(a[i]);
  15. }
  16. for(i=1;i<=m;i++)scanf("%d",&b[i]),v[b[i]]=1;
  17. for(i=2;i<=m;i++)if(len[b[i]]!=len[b[1]])return puts("No"),0;
  18. L=len[b[1]];
  19. for(i=0;i<L;i++){
  20. s[i]=a[b[1]][i];
  21. for(j=2;j<=m;j++)if(s[i]!=a[b[j]][i]){s[i]='?';break;}
  22. }
  23. for(i=1;i<=n;i++)if(check(i)!=v[i])return puts("No"),0;
  24. puts("Yes");
  25. for(i=0;i<L;i++)putchar(s[i]);
  26. return 0;
  27. }

  

I. Olympiad in Programming and Sports

最大费用最大流裸题。

  1. #include <bits/stdc++.h>
  2. using namespace std ;
  3.  
  4. typedef pair < int , int > pii ;
  5.  
  6. #define clr( a , x ) memset ( a , x , sizeof a )
  7.  
  8. const int MAXN = 20005 ;
  9. const int MAXE = 1000005 ;
  10. const int INF = 0x3f3f3f3f ;
  11.  
  12. struct Edge {
  13. int v , c , w , n ;
  14. Edge () {}
  15. Edge ( int v , int c , int w , int n ) : v ( v ) , c ( c ) , w ( w ) , n ( n ) {}
  16. } ;
  17.  
  18. Edge E[MAXE] ;
  19. int H[MAXN] , cntE ;
  20. int d[MAXN] , vis[MAXN] , cur[MAXN] ;
  21. int Q[MAXN] , head , tail ;
  22. int s , t ;
  23. int flow , cost ;
  24. int n , P , S ;
  25. vector < int > A , B ;
  26.  
  27. void init () {
  28. cntE = 0 ;
  29. clr ( H , -1 ) ;
  30. }
  31.  
  32. void addedge ( int u , int v , int c , int w ) {
  33. E[cntE] = Edge ( v , c , w , H[u] ) ;
  34. H[u] = cntE ++ ;
  35. E[cntE] = Edge ( u , 0 , -w , H[v] ) ;
  36. H[v] = cntE ++ ;
  37. }
  38.  
  39. int spfa () {
  40. clr ( d , INF ) ;
  41. clr ( vis , 0 ) ;
  42. head = tail = 0 ;
  43. Q[tail ++] = s ;
  44. d[s] = 0 ;
  45. cur[s] = -1 ;
  46. while ( head != tail ) {
  47. int u = Q[head ++] ;
  48. if ( head == MAXN ) head = 0 ;
  49. vis[u] = 0 ;
  50. for ( int i = H[u] ; ~i ; i = E[i].n ) {
  51. int v = E[i].v ;
  52. if ( E[i].c && d[v] > d[u] + E[i].w ) {
  53. d[v] = d[u] + E[i].w ;
  54. cur[v] = i ;
  55. if ( !vis[v] ) {
  56. vis[v] = 1 ;
  57. Q[tail ++] = v ;
  58. if ( tail == MAXN ) tail = 0 ;
  59. }
  60. }
  61. }
  62. }
  63. if ( d[t] == INF ) return 0 ;
  64. cost += d[t] ;
  65. flow ++ ;
  66. for ( int i = cur[t] ; ~i ; i = cur[E[i ^ 1].v] ) {
  67. E[i].c -- ;
  68. E[i ^ 1].c ++ ;
  69. }
  70. return 1 ;
  71. }
  72.  
  73. void solve () {
  74. init () ;
  75. s = 0 ;
  76. t = n + 2 + 1 ;
  77. int pt = n + 1 ;
  78. int st = n + 2 ;
  79. for ( int i = 1 ; i <= n ; ++ i ) {
  80. int x ;
  81. scanf ( "%d" , &x ) ;
  82. addedge ( s , i , 1 , 0 ) ;
  83. addedge ( i , pt , 1 , -x ) ;
  84. }
  85. for ( int i = 1 ; i <= n ; ++ i ) {
  86. int x ;
  87. scanf ( "%d" , &x ) ;
  88. addedge ( i , st , 1 , -x ) ;
  89. }
  90. addedge ( pt , t , P , 0 ) ;
  91. addedge ( st , t , S , 0 ) ;
  92. cost = flow = 0 ;
  93. while ( spfa () ) ;
  94. printf ( "%d\n" , -cost ) ;
  95. A.clear () ;
  96. B.clear () ;
  97. for ( int i = 1 ; i <= n ; ++ i ) {
  98. for ( int j = H[i] ; ~j ; j = E[j].n ) {
  99. int v = E[j].v ;
  100. if ( v == s ) continue ;
  101. if ( E[j].c == 0 ) {
  102. if ( v == pt ) A.push_back ( i ) ;
  103. else B.push_back ( i ) ;
  104. break ;
  105. }
  106. }
  107. }
  108. for ( int i = 0 ; i < A.size () ; ++ i ) {
  109. printf ( "%d%c" , A[i] , i < A.size () - 1 ? ' ' : '\n' ) ;
  110. }
  111. for ( int i = 0 ; i < B.size () ; ++ i ) {
  112. printf ( "%d%c" , B[i] , i < B.size () - 1 ? ' ' : '\n' ) ;
  113. }
  114. }
  115.  
  116. int main () {
  117. while ( ~scanf ( "%d%d%d" , &n , &P , &S ) ) solve () ;
  118. return 0 ;
  119. }

  

J. Bottles

$f[i][j][k]$表示考虑了前$i$个瓶子,目前需要保留$j$个瓶子,容量总和减去被占走的为$k$的最小代价,然后DP即可。

时间复杂度$O(n^4)$。

  1. #include<cstdio>
  2. const int N=105,M=20005,K=10000,inf=10000000;
  3. int n,i,j,k,x,a[N],b[N],f[2][N][M];
  4. inline void up(int&x,int y){if(x>y)x=y;}
  5. int main(){
  6. scanf("%d",&n);
  7. for(i=1;i<=n;i++)scanf("%d",&a[i]);
  8. for(i=1;i<=n;i++)scanf("%d",&b[i]),b[i]-=a[i];
  9. for(i=0;i<2;i++)for(j=0;j<=n;j++)for(k=0;k<M;k++)f[i][j][k]=inf;
  10. f[0][0][K]=0;
  11. for(i=x=1;i<=n;i++,x^=1){
  12. for(j=0;j<=n;j++)for(k=0;k<M;k++)f[x][j][k]=inf;
  13. for(j=0;j<=n;j++)for(k=0;k<M;k++)if(f[x^1][j][k]<inf){
  14. if(k+b[i]<M)up(f[x][j+1][k+b[i]],f[x^1][j][k]);
  15. if(k-a[i]>=0)up(f[x][j][k-a[i]],f[x^1][j][k]+a[i]);
  16. }
  17. }
  18. for(i=0;i<=n;i++){
  19. int now=inf;
  20. for(j=K;j<M;j++)if(f[x^1][i][j]<inf)up(now,f[x^1][i][j]);
  21. if(now<inf)return printf("%d %d",i,now),0;
  22. }
  23. }

  

K. Roads Orientation Problem

留坑。

L. Expression Queries

看上去是很难写的模拟+倍增。

留坑。


总结:

  • A题poursoul没想清楚就上去写,导致错误2发,浪费了半小时机时,对于水题也应该准备充分。
  • D题_ilovelife读错输出格式,导致产生无效罚时,下次应注意。

2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest的更多相关文章

  1. 2018-2019 ICPC, NEERC, Southern Subregional Contest

    目录 2018-2019 ICPC, NEERC, Southern Subregional Contest (Codeforces 1070) A.Find a Number(BFS) C.Clou ...

  2. Codeforces 2018-2019 ICPC, NEERC, Southern Subregional Contest

    2018-2019 ICPC, NEERC, Southern Subregional Contest 闲谈: 被操哥和男神带飞的一场ACM,第一把做了这么多题,荣幸成为7题队,虽然比赛的时候频频出锅 ...

  3. 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror) Solution

    从这里开始 题目列表 瞎扯 Problem A Find a Number Problem B Berkomnadzor Problem C Cloud Computing Problem D Gar ...

  4. Codeforces1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred)总结

    第一次打ACM比赛,和yyf两个人一起搞事情 感觉被两个学长队暴打的好惨啊 然后我一直做傻子题,yyf一直在切神仙题 然后放一波题解(部分) A. Find a Number LINK 题目大意 给你 ...

  5. codeforce1070 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) 题解

    秉承ACM团队合作的思想懒,这篇blog只有部分题解,剩余的请前往星感大神Star_Feel的blog食用(表示男神汉克斯更懒不屑于写我们分别代写了下...) C. Cloud Computing 扫 ...

  6. 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred)

    A. Find a Number 找到一个树,可以被d整除,且数字和为s 记忆化搜索 static class S{ int mod,s; String str; public S(int mod, ...

  7. 2018.10.20 2018-2019 ICPC,NEERC,Southern Subregional Contest(Online Mirror, ACM-ICPC Rules)

    i207M的“怕不是一个小时就要弃疗的flag”并没有生效,这次居然写到了最后,好评=.= 然而可能是退役前和i207M的最后一场比赛了TAT 不过打得真的好爽啊QAQ 最终结果: 看见那几个罚时没, ...

  8. 2018-2019 ICPC, NEERC, Southern Subregional Contest (Online Mirror, ACM-ICPC Rules, Teams Preferred) Solution

    A. Find a Number Solved By 2017212212083 题意:$找一个最小的n使得n % d == 0 并且 n 的每一位数字加起来之和为s$ 思路: 定义一个二元组$< ...

  9. 【*2000】【2018-2019 ICPC, NEERC, Southern Subregional Contest C 】Cloud Computing

    [链接] 我是链接,点我呀:) [题意] [题解] 我们可以很容易知道区间的每个位置有哪些安排可以用. 显然 我们优先用那些花费的钱比较少的租用cpu方案. 但一个方案可供租用的cpu有限. 我们可以 ...

  10. 2018-2019 ICPC, NEERC, Southern Subregional Contest (codeforces 1070)

    A. 直接从状态(0,0)bfs, 这样一定是最小的 #include <iostream> #include <sstream> #include <algorithm ...

随机推荐

  1. SQLServer2000数据库的安装

    ==================. 未完待续,持续更新中... -------------------------------------------------

  2. Jquery实现花瓣随机飘落(收藏自慕课网)

    这个东西实际上慕课的艾伦大大先写的. 然后别人推荐给我,偶一直收藏着,然后偶再推荐给偶的队友们,然后呢,这帮货就懒得都不肯去看... 接着今天受伤在家就提出来了一点东西放在我博客顶上... 然后艾伦的 ...

  3. 群里分享的react的收藏一下!今日周末,改了个表单验证然后无所事事了!

    今日周末,改了个表单验证然后无所事事了,然后把昨天群里分享的react的收藏一下尽管现在还在研究angular和nodeJs毕竟刚刚开始用有点不熟...没准以后会研究一下react毕竟看着下面这张图还 ...

  4. 大熊君JavaScript插件化开发------(第二季)

    一,开篇分析 Hi,大家好!大熊君又和大家见面了,还记得昨天的那篇文章吗------这个系列的开篇(第一季).主要讲述了以“jQuery的方式如何开发插件”, 那么今天我们带着昨天的疑问来继续我们的插 ...

  5. python 3编码

    python 3和2很大区别就是python本身改为默认用unicode编码. 字符串不再区分"abc"和u"abc", 字符串"abc"默 ...

  6. 0、Web基本概念

    一.Web的概念: 本意是蜘蛛网和网的意思,在网页设计中我们称为网页的意思. 二.Web的分类:Internet上供外界访问的Web资源分为静态Web资源和动态Web资源两种. 1.静态Web资源:W ...

  7. maven项目常见问题

    问题1:Maven项目,右键-update project后报错如下的解决办法: 1).DescriptionResourcePathLocationType Java compiler level ...

  8. js制作烟花效果

    <html> <head> <link type="text/css" rel="stylesheet" href="c ...

  9. python嵌套函数、闭包与decorator

    1 一段代码的执行结果不光取决与代码中的符号,更多地是取决于代码中符号的意义,而运行时的意义是由名字空间决定的.名字空间是在运行时由python虚拟机动态维护的,但是有时候我们希望能将名字空间静态化. ...

  10. T-SQL 语句的优化

    SQL调优. 1.索引是数据库调优的最根本的优化方法.聚簇索引.非聚簇索引. 聚簇索引:物理序与索引顺序相同.(只能有一个) 非聚簇索引:物理顺序与索引顺序不相同. 2.调整WHERE 子句中的连接顺 ...