几道不错的TC题

文章目录


如果大家在TC的哪一场见到过这几题务必告诉我,我将不胜感激.

T1

n , a [ i ] , b [ i ] , : ( a [ i ] 1 ) , ( b [ i ] + 1 ) ; ( a [ i ] ) , b [ i ] ; ( a [ i ] + 1 ) , ( b [ i ] 1 ) . c [ i ] , k . 1. n个盒子,每个盒子标签贴着有a[i]个红球,有b[i]个蓝球,但实际上有可能有三种情况:\newline (a[i]-1)个红球,(b[i]+1)个蓝球;\newline (a[i])个红球,b[i]个蓝球;\newline (a[i]+1)个红球,(b[i]-1)个蓝球.\newline 买一个盒子需要c[i]的钱,求最少需要多少钱才能够保证获得k个球.不能输出-1.
要想保证获得 k k 个球有三种方法:

  1. 第一种,直接去找红色球,买 i i 个盒子,盒子里表明红球的总个数是 k + i k+i 或者更多.
  2. 同理,直接去买蓝色球.
  3. 买的盒子里的红蓝两种球的总个数是 2 × k 1 2\times k-1 或者更多,这样子不管如何,都能够有一种球的个数大于或者等于 k k .

我们利用这样的思路,跑三次01背包,求出花费的最小值.
转化清奇的一道01背包,不错的题.

#include<bits/stdc++.h> //Ithea Myse Valgulious
using namespace std;
const int yuzu=1e5,inf=0x3f3f3f3f;
typedef int fuko[yuzu|10];
fuko a,b,c,d,dp;
 
int bao(int *v,int k,int n){
int i,j;
fill(dp+1,dp+yuzu,inf);
for (i=1;i<=n;++i)
  for (v[i]--,j=k;~j;--j)
    dp[min(k,j+v[i])]=min(dp[min(k,j+v[i])],dp[j]+c[i]);
return dp[k];
}
 
int main(){
int i,n,k,j; read(n),read(k);
for (i=1;i<=n;++i) a[i]=read();
for (i=1;i<=n;++i) d[i]=a[i]+1+(b[i]=read());
for (i=1;i<=n;++i) c[i]=read();
/*d[i]=a[i]+b[i]*/
int llx=min(bao(d,k*2-1,n),min(bao(a,k,n),bao(b,k,n)));
write(llx^inf?llx:-1);
}

T2

, . . d ( i , j ) i , j . i = 0 n 1 j = i + 1 n 1 d ( i , j ) . 给一张连通无向图,有点权有边权.\newline定义一条路径的难度值为该路径上的最大点权乘最大边权.\newline 定义d(i,j)表示i,j两点之间路径的最小难度值.\newline 求\sum_{i=0}^{n-1}\sum_{j=i+1}^{n-1}d(i,j).
这个东西有两维,用普通的方法很难计算.
我们考虑用排序先消掉一维的复杂度.
将点按照点权排序,每次加入一个点,用 f l o y d floyd 更新已经加入的两点之间的最大路和路径的最小难度值.
数据范围一小下来我瞬间就爆炸了,连 f l o y d floyd 都想不到了.

#include<bits/stdc++.h> //Ithea Myse Valgulious
using namespace std;
const int aoi=3058,inf=0x3f3f3f3f;
typedef int nao[aoi];
nao a,b,dis[aoi],v,id;
ll ans[aoi][aoi];
int main(){
int i,n,m,j,k;
read(n),read(m);
memset(dis,0x3f,sizeof dis);
memset(ans,0x3f,sizeof ans);
for (i=1;i<=m;++i) a[i]=read()+1;
for (i=1;i<=m;++i) b[i]=read()+1;
for (i=1;i<=m;++i){
  int d=read();
  dis[a[i]][b[i]]=min(dis[a[i]][b[i]],d);
  dis[b[i]][a[i]]=min(dis[b[i]][a[i]],d);
  }// 数据有重边!
for (i=1;i<=n;++i)
  v[i]=read(),dis[i][i]=ans[i][i]=0,id[i]=i;
for (i=1;i<=n;++i){
  for (j=1;j<n;++j)
    if (v[id[j]]>v[id[j+1]]) swap(id[j],id[j+1]);
  }
/*数据范围小的时候我会习惯性用冒泡排序.下面那句sort与上面的两个循环效果相同.*/
//sort(id+1,id+n+1,[&](int a,int b){return v[a]<v[b];});
ll llx=0;
for (k=1;k<=n;++k){
  for (i=1;i<=n;++i)
    for (j=1;j<=n;++j)
      dis[i][j]=min(dis[i][j],max(dis[i][id[k]],dis[id[k]][j])); //floyd更新最大边
  for (i=1;i<=k;++i)
    for (j=1;j<=k;++j)
      if (dis[id[i]][id[j]]<inf)
        ans[id[i]][id[j]]=min(ans[id[i]][id[j]],1ll*dis[id[i]][id[j]]*v[id[k]]); // 更新d(i,j)
  }
for (i=1;i<=n;++i)
  for (j=i+1;j<=n;++j) llx+=ans[i][j];
write(llx);
}

T3

超级好题,我要吹爆它!这是我见过最有意思的构造题!
n , 使 , . 1 0 18 . 构造一个长为n的序列,使得相邻的数互质,不相邻的数不互质.每个数小于10^{18}.
一开始想了一个假算法,只能过 n 13 n\leq 13 .
后来机房大佬纷纷用搜索啊,random_shuffle,打表等神仙做法AC此题.
接下来介绍一个公认AC的玄学做法.
一开始将序列所有数赋值为 1 1 ,并大略找个上界筛一下素数.
操作 1 0 6 10^6 次,每一次随机选择两个不相同也不相邻的位置,如果这两个位置的数互质,找到最小的质数 x x 满足两数乘上 x x 后仍能保证相邻数互质.
注意每个数不需要两个相同质因子,因此让 a [ i ] a[i] x x 求一波 l c m lcm .
接下来花大概 4 s 4s 就可以构造出一组 n = 500 n=500 的解,用 s p j spj 检测通过后打表输出前 n n 项AC此题.

#include<bits/stdc++.h> //Ithea Myse Valgulious
using namespace std;
//const int yuzu=5e6;
//typedef int fuko[yuzu|10];
//fuko p,pr,id;
//ll a[509];
//
//void doing_prime(int n){
//int i,j;
//for (i=2;i<=n;++i){
//  if (!p[i]) p[i]=pr[++*pr]=i;
//  for (j=1;j<=*pr;++j) {
//    if (pr[j]*i>n) break;
//    p[pr[j]*i]=pr[j];
//    if (i%pr[j]==0) break;
//    }
//  }
//}
//
//int main(){
//ran::init();
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
//int i,t,n=read(),now;
//fill(a+1,a+n+1,1);
//doing_prime(yuzu);
//for (t=1e6;t--;){
//  int l=rnd(1,n),r=rnd(1,n);  //  rnd(l,r) 表示产生[l,r]之间的随机数,大家自己去写随机函数就可以了.
//  for (;abs(l-r)<=1;) l=rnd(1,n),r=rnd(1,n);
//  if (l>r) swap(l,r);
//  if (__gcd(a[l],a[r])==1){
//    for (i=1;i<=*pr;++i){
//      int nico=1;
//      if (l>1&&a[l-1]%pr[i]==0) nico=0;
//      if (l<n&&a[l+1]%pr[i]==0) nico=0;
//      if (r>1&&a[r-1]%pr[i]==0) nico=0;
//      if (r<n&&a[r+1]%pr[i]==0) nico=0;
//      if (nico){
//        if (a[l]%pr[i]) a[l]*=pr[i];
//        if (a[r]%pr[i]) a[r]*=pr[i];
//        break;
//        }
//      }
//    }
//  }
//for (i=1;i<=n;++i) write(a[i]),p32;
//}
/*以上打表代码,4s可跑出一组正解.*/
ll a[]={635832100505,14790415370874,88754595265,1008880075346,510620313,8616792470,1017132345327,40677599534,708269555,1403377183923,30139130,1203700875663,958312184410,45350520189689,54935454,742461005,6270489678,31655837395,3186241014,3355036584445,9810599802,46660085395,6695163086937,16153307330,115222107,375067416365,18183954698,97380516783,11493670630,4674579063,30215068390,5490826175527,25627559898,10627510985,5754027817802,1985543988519,5152398245,832066250554,19950271185,39307997278,76508461435,212977479,8137778810,10697738839491,2598785410,960255304701,282192250210,250877512039,404797437915,22438358558,127292685,2415259693,26208390,139045812521,24561521290,169645589997,28598794654738,24551773545,69998907209,724280574342,17128257791435,727509036111,4229441707210,15635690007,83810870,737839977,307469660030,752616718161,197368396186,6209976860045,115556382777,1779306542,549248599095,193343296003,4931973830,39266674511493,65596930,865029666017,1280241479595,47697242963678,213696795,8701750169,90262236922,531792633435,112589916862,109667415,5606859454,31175455155,81787015079,22062629802,604864715,2364737235729,2867236190,26259501741,981168224218,232007144105,680405879478,62876478035,353051715731,457936076190,2113092163,9748182345,531652186,10605793695,6388294,23727380313,40517754695,19050486,10135329996055,3932078822607,109034813220718,2133910805,33576390771,15806244970,70500086657,46467375555,668437998046,13588380795,4153172114,20128777185,19814359838,468921387,34749063895,348451219758,702589782895,351847731426,2189865535,362154519372506,381237031461,14991970210,2811785029001,11923960587,15680510830,7263074485667,17090610,111721851241,98107374,3509101645,226232078478549,12808647790,3552703535381,2361381730815,1257895031666,509517965,92831298,2951488416305,3605373786,38660569805,16414802886,145580435,9908136834,40127396309,4341935670,3417756545203,30550820385,622429769654,17491737056105,14396800803,5745663592474,6369064477435,17209992891,8748565430,7998886527801,1202626071955,3499999386,2200998159745,90473214,44930784185,53931046598,1714241566023,227029948535,796833114,295825704005,1843642044986,7392571395,8291298106,74852433214185,182081662,229757385,267792516677,543280777842,1472820245,247348779342,1010277785,1607767065723,15322018570,110940448619,943103730,258947806271,73249903246,35673070665,17316126058,12180016095,5410826498,463304145,11735957506,1439288627865,887071881878,5589135303411,68578565335,56924290358,569415,534320774,326159085,4344260206,9416976135,18561839062,1388062282299,1496922505,43680447693366,1469032747,15735228465,2259771197306,14797810599,7712381390,5274004640853,45113320054,3915703155,1347368014,1018180965945,1022530056926,2765168869749,6465998889385,15650778,87178119805,75932063493,64936547266,127978305,30578586434,342553814239,1851012015,510082780922,5441910860995,216758221914,32340639485,2584929594,14034617135,155577711666,19256800255,707763245394,81144172109,27852730130,4409381099721,10208548042,9928655295,1605433951814,1162316793615,27419018198,46118283995,164582676687,1265164307722,1180578476415,1436472727954,42407502865,205665906666,1025171315,31423323074,246383512719,1202548655,26154403678,63968241615,646646,33221632515,490480991,40440210,5548777140907,1081600095,9098303522,23854616565,49870401119374,470372721,243129590,279986889,73043886938,301354515865,1185303074403,6703538270,36059698563,46487870,16603963971,436985978,5489388933035,10832786382,210940951403,9770169310,253644573,242882665135,46342714306,380937765,306972895306,363511462189863,20741411845,3441748362,7163170446245,1342934606559,759455422,28833597065,32293516602,78486604955,2208368908382,3182628444963,14613703510,50254886253,17547896230,3640823507321,1851308670,104388377093,885643060578,328617905,6688741722,106485812965,73283900118,30813812803465,1308105728566,195206311509,2718747430,22157470387,754591241481,21123754730,1498054943,603298808034,766211042905,4114020685294,733077592401,33091035946930,181298759411,12581885742,271012105,417337631502,10030424677,1310857708430,42131504877,2542707913954,68815062415605,424585073731,8789218790,56419919493,11515729654,44656693035,6228316253159,11384080090,51479635389,1185138132838,2802955092665,5589863466,210925186381,11975711990,1433122092129,2290391290,25333924161,33712804730,8618184939,331936741730,11453388499,30399346263,5784487870,11086038249,6682269790,49305934821,6326313530,2130642222891,8439910270,97588371387,759671546095,1313864191518,28323643985,39311646,504561785,253545633462,1493732125795,1318714419858,24714907945,280419067978654,8860552144041,17722792430,1785528173,12031530,159332131673,992082345,29818805198,19007267367,21182641970,244366480501,3215793563409,57985070,1514896809,1654804690,152728619277,179278195910,28037397072139,73998705,12947308738,4557714393441,36179865184610,8372356707,8461630730,62720375619,2008918730,172800415029,780529327214,3659111586255,378361940726,12138704565,8706105254,14952241005,412852675466,4013109592365,463664732102,3389656795959,11073586810,162695589141,54245487065,3584948406,5148508734985,5941630866,819139115795,28776901782,53599728655,107376236331,14401397890,585856886719,20019971433,8405407270,256162137,17463394,9044798235,11188520798,15751064505,671881106,23962548687,491666879210,87338906963,17151170205,92558173466,26116161141,47900710,16114227087,223866170,253913947469,1465202301585,8154230266,140191095,421891834,7022299395,21062138482,312772395,40519557562,2316176178771,1478839474270,22354093047,4135781930,231523344294099,356836522210,2409207183591,107207870,45902926329,4382743610,986019631311,71131570678,1144911132255,25343095882,798623133,113119779305,16386382927398,154068115705,7532934838,4326223335,1751628906742,1393691705,6864884466,5642111299643,8338701470,19335470973,25141971602,10925159505,479088091174,663107424915,962296869842,681317448045,23998702707826,12302463615,814944237151,419750961910,37974422343,162558699310,86478425121,997802693615,15112689103578,2561486135,798583310602,228695015949,53858272195,456258682,409797775905,16447839694,5593906225565,3016189035717,3379346530,416736177,31393390};
int main(){
int i,n=read();
for (i=0;i<n;++i) cout<<a[i]<<" ";
}

猜你喜欢

转载自blog.csdn.net/qq_31908675/article/details/82974334