活动地址:CSDN21天学习挑战赛
一看以为这是树的题目,但其实是比较水的,观察一下可以发现加了另外一个颜色后非叶子节点会多加一遍,所以我们优先让权值大的多加一遍,这个点的权值可以加的次数是这个点的度数-1,这题就做完了,统计度数之后从大到小依次加就行
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- //HDU火车头
- //#include
- #define ll long long
- #define lowbit(x) ((x)&(-x))
- using namespace std;
- int mod=1e9+7;
- double eps=1e-8;
- ll t,n,in[200005];
- struct node{
- ll id,val;
- bool operator<(const node& a) const{
- return val>a.val;
- }
- }w[200005];
- int main(){
- scanf("%lld",&t);
- while(t--){
- scanf("%lld",&n);
- ll sum=0;
- for(int i=1;i<=n;i++) scanf("%lld",&w[i].val),sum+=w[i].val,w[i].id=i;
- for(int i=1;i
- ll u,v;
- scanf("%lld%lld",&u,&v);
- in[u]++;in[v]++;
- }
- sort(w+1,w+n+1);
- printf("%lld ",sum);
- for(int i=1;i<=n;i++){
- while(in[w[i].id]>1){
- sum+=w[i].val;
- printf("%lld ",sum);
- in[w[i].id]--;
- }
- }
- printf("\n");
- for(int i=1;i<=n;i++) in[i]=0;
- }
- system("pause");
- return 0;
- }
-
P6140 [USACO07NOV]Best Cow Line S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这题的数据较弱直接暴力就能过,首尾比较每次都先放小的,如果相等的话就去前面比较,一直比到不相等为止,然后在判断哪个小就放哪个,如果都相等就随便放
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- //HDU火车头
- //#include
- #define ll long long
- #define lowbit(x) ((x)&(-x))
- using namespace std;
- int mod=1e9+7;
- double eps=1e-8;
- ll n,m;
- char s[500005];
- bool cmp(ll l,ll r){
- while(s[l]==s[r]&&l
- if(l
return s[l] - else return 1;
- }
- int main(){
- scanf("%lld",&n);
- for(int i=1;i<=n;i++) cin>>s[i];
- ll l=1,r=n,cnt=0;
- while(l<=r){
- if(s[l]
- else if(s[l]>s[r]){cout<
- else{
- if(cmp(l,r)){cout<
- else{cout<
- }
- if(cnt>=80){printf("\n");cnt=0;}
- }
- system("pause");
- return 0;
- }
-
1519D - Maximum Sum of Products 区间dp
感觉之前做过类似的,然后就疯狂的想试一试之前的结论管不管用,然后试了半天也不对,最后看题解是区间dp,,,dp[i][j]表示i到j这块区间反转,c[i]表示前缀和,转移也很好转移,dp[i][j]=dp[i+1][j-1]+a[j]*b[i]+a[i]*b[j],就是由小区间转移到大区间,枚举长度和起点就可以了
D. Maximum Sum of Products(前缀和 + 区间dp)_青山_12的博客-CSDN博客
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- //HDU火车头
- //#include
- #define ll long long
- #define lowbit(x) ((x)&(-x))
- using namespace std;
- int mod=1e9+7;
- double eps=1e-8;
- ll n,a[5005],b[5005],c[5005],dp[5005][5005];
- int main(){
- scanf("%lld",&n);
- for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
- for(int i=1;i<=n;i++) scanf("%lld",&b[i]),c[i]=c[i-1]+a[i]*b[i],dp[i][i]=a[i]*b[i];
- ll ans=c[n];
- for(int len=1;len
- for(int i=1;i+len<=n;i++){
- ll j=i+len;
- dp[i][j]=dp[i+1][j-1]+a[j]*b[i]+a[i]*b[j];
- ll sum=dp[i][j]-(c[j]-c[i-1])+c[n];
- ans=max(ans,sum);
- }
- printf("%lld\n",ans);
- system("pause");
- return 0;
- }
-
B-Gaming_牛客小白月赛54 (nowcoder.com) 差分
淦,从出发点就想错了,想成了区间覆盖,丫的根本就不是,因为他只需要不要一个debuff就可以了,就可以去枚举不要那个损失最少,把区间的s[i]都加到每个点上,然后总和减去最小的点就可以
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- //HDU火车头
- //#include
- #define ll long long
- #define lowbit(x) ((x)&(-x))
- using namespace std;
- int mod=1e7+7;
- double eps=1e-8;
- ll n,m,b[1000006];
- int main(){
- scanf("%lld%lld",&n,&m);
- ll minn=1e18,ans=0;
- for(int i=1;i<=n;i++){
- ll x,y,z;
- scanf("%lld%lld%lld",&x,&y,&z);
- b[x]+=z;b[y+1]-=z;
- ans+=z;
- }
- for(int i=1;i<=m;i++) b[i]+=b[i-1];
- for(int i=1;i<=m;i++) minn=min(minn,b[i]);
- printf("%lld\n",ans-minn);
- system("pause");
- return 0;
- }
-
C-School_牛客小白月赛54 (nowcoder.com)
c题很直白,唯一卡住的点就是应该把这些时段能合并的合并,不然r是无序的, 二分出来可能是错误的答案
- #include
- using namespace std;
- #define ll long long
- #define lowbit(i) ((i)&(-i))
- const ll mod=1e9+7;
- double eps=1e-8;
- ll n,h,m,q;
- struct node{
- ll l,r;
- bool operator<(const node &a) const{
- return r
- }
- }v[1005],u[1005];
- bool cmp(node &a,node &b){
- if(a.l==b.l) return a.r
- return a.l
- }
- int main(){
- scanf("%lld%lld%lld%lld",&n,&h,&m,&q);
- for(int i=1;i<=n;i++){
- ll a,b,c,d;
- scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
- v[i].l=(a)*m+b;
- v[i].r=(c)*m+d;
- }
- sort(v+1,v+n+1,cmp);
- ll cnt=1;u[1]=v[1];
- for(int i=2;i<=n;i++){
- if(u[cnt].r
- else{
- u[cnt].r=max(u[cnt].r,v[i].r);
- }
- }
- while(q--){
- ll x,y;
- scanf("%lld%lld",&x,&y);
- node tmp;
- tmp.l=(x)*m+y;
- tmp.r=(x)*m+y;
- ll id=lower_bound(u+1,u+cnt+1,tmp)-u;
- //cout<
- if(id>cnt) printf("Yes\n");
- else{
- if(tmp.l>=u[id].l) printf("No\n");
- else printf("Yes\n");
- }
- }
- system("pause");
- return 0;
- }
D-Word_牛客小白月赛54 (nowcoder.com)
把能互相转移的两个点之间建一条边,然后跑最短路就可以了,还是个板子,淦,让B卡住了,没想到c和d也不难
- #include
- using namespace std;
- #define ll long long
- #define lowbit(i) ((i)&(-i))
- const ll mod=1e9+7;
- double eps=1e-8;
- ll n,m;
- ll ss=0,tt=0,dist[20005],pre[20005],vis[20005];
- string a[20005],s,t;
- ll head[40010],cnt;
- struct Edge{
- ll from,to,dis,next;
- }edge[40010];
- void addedge(ll from,ll to,ll w){
- edge[++cnt].from=from;
- edge[cnt].to=to;
- edge[cnt].dis=w;
- edge[cnt].next=head[from];
- head[from]=cnt;
- }
- bool pd(string s1,string s2){
- ll res=0;
- for(int i=0;i
- if(s1[i]!=s2[i]) res++;
- return res==1;
- }
- struct node{
- ll id,dis;
- bool operator<(const node& x) const{
- return x.dis
- }
- };
- void print(ll s,ll t){
- if(s==t){cout<"\n";return;}
- print(s,pre[t]);
- cout<"\n";
- }
- void bfs(){
- for(int i=1;i<=n;i++) dist[i]=1e18;
- for(int j=1;j<=n;j++) vis[j]=0;
- dist[ss]=0;
- priority_queue
q; - q.push(node{ss,0});
- while(!q.empty()){
- node u=q.top();q.pop();
- ll now=u.id;
- if(vis[now]) continue;
- vis[now]=1;
- for(int i=head[now];i;i=edge[i].next){
- ll j=edge[i].to;
- if(dist[now]+edge[i].dis
- dist[j]=dist[now]+edge[i].dis;
- if(!vis[j]) q.push(node{j,dist[j]});
- pre[j]=now;
- }
- }
- }
- if(dist[tt]==1e18){
- printf("-1\n");
- }
- else{
- printf("%lld\n",dist[tt]-1);
- print(ss,tt);
- }
- }
- int main(){
- scanf("%lld%lld",&n,&m);
- for(int i=1;i<=n;i++) cin>>a[i];
- cin>>s>>t;
- if(s==t){
- cout<<0<<"\n"<
"\n"<"\n"; - return 0;
- }
- for(int i=1;i<=n;i++){
- if(a[i]==s) ss=i;
- if(a[i]==t) tt=i;
- }
- if(!ss) a[++n]=s,ss=n;
- if(!tt) a[++n]=t,tt=n;
- for(int i=1;i<=n;i++)
- for(int j=1;j<=n;j++){
- if(i==j) continue;
- if(pd(a[i],a[j])) addedge(i,j,1),addedge(j,i,1);
- }
- bfs();
- system("pause");
- return 0;
- }
-
相关阅读:
自学Python第十天- 异常
网络安全(黑客)——2024自学
redis缓存穿透、击穿、雪崩
【Python数据结构与算法】线性结构小结
Win10右键 nvidia rtx desktop manager 怎么删除(最新)
使用招商银行云直连服务提现(.Net6)
Nignx部署前端页面
JS实现二叉排搜索树
【STM32】基本定时器
NISP-SO网络安全运维是什么?安全运维工程师
-
原文地址:https://blog.csdn.net/weixin_52621204/article/details/126304094