这次csp时100+100+100+20的操作,第三题还是没有写,我考试的时候总是喜欢把第三题放到最后,前面花了好多时间就没有写这道题,大模拟永远的痛~~,第四题其实用对了数据结构还是蛮简单的,我用优先队列存储每一个商品的类别编号分数,时间复杂度就大大降低,代码也十分简化。第五题正解是树形dp,但我老是运行错误,于是抓紧写了个暴力。
#include <bits/stdc++.h>
using namespace std;
int n,m,sum,id,ans;
int a;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int num=0;
for(int j=0;j<=m;j++)
{
cin>>a;
sum+=a;
if(j==0) continue;
num-=a;
}
if(num>ans)
{
ans=num;
id=i;
}
}
cout<<sum<<" "<<id<<" "<<ans;
return 0;
}
/*
3 3
73 -8 -6 -4
76 -5 -10 -8
80 -6 -15 0*/
#include <bits/stdc++.h>
using namespace std;
int st[1000];
int n,m,num,sum,ans,e;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>m;
int flag=0;
sum=0;
for(int j=1;j<=m;j++)
{
int a;
cin>>a;
if(j==1)
{
sum=a;
continue;
}
if(a>0)
{
if(sum!=a)
{
flag=1;
sum=a;
}
}
else
{
sum+=a;
}
}
if(flag)
{
st[i]=1;
num++;
}
ans+=sum;
}
if(num<3) e=0;
else
{
for(int i=0;i<n;i++)
{
if(st[i]&&st[(i+1)%n]&&st[(i+2)%n]) e++;
}
}
cout<<ans<<" "<<num<<" "<<e;
return 0;
}
/*
4
4 74 -7 -12 -5
5 73 -8 -6 59 -4
5 76 -5 -10 60 -2
5 80 -6 -15 59 0
*/
#include <iostream>
#include <queue>
#include <vector>
#include <map>
#include <utility>
const int N=51;
const int NUM=1e6;
using namespace std;
struct node{
int id1;//类别
int comm, s;//编号,分数
bool operator <(const node &t)const
{
if(s==t.s)
{
if(id1==t.id1) return comm>t.comm;
return id1>t.id1;
}
return s<t.s;
}
};
int m,n;
vector<int>ans[N];
priority_queue<node>q,tem;
map<pair<int,int>,int> mp;
void func1()
{
int typ,comm ,score;
cin>>typ>>comm>>score;
q.push({typ,comm,score});
}
void func2()
{
int typ, comm;
cin>>typ>>comm;
mp[{typ,comm}]=1;
}
void func3()
{
int num,k[m];
cin>>num;
for(int i=0;i<m;i++) cin>>k[i];
for(int i=0;i<num;)
{
if(!q.size()) break;
node u=q.top();
q.pop();
tem.push(u);
if(!k[u.id1]||mp[{u.id1,u.comm}]) continue;
k[u.id1]--;
ans[u.id1].push_back(u.comm);
i++;
}
while(tem.size())
{
node u=tem.top();
tem.pop();
q.push(u);
}
for(int i=0;i<m;i++)
{
int ll=ans[i].size();
if(!ll)
{
cout<<-1<<endl;
continue;
}
for(int j=0;j<ll;j++)
cout<<ans[i][j]<<" ";
cout<<endl;
ans[i].clear();
}
}
int main()
{
cin>>m>>n;
int score, id;
for(int i=1;i<=n;i++)
{
cin>>id>>score;
for(int j=0;j<m;j++)
{
q.push({j,id,score});
}
}
int op;
cin>>op;
while(op--)
{
int typ;
cin>>typ;
if(typ==1) func1();
else if(typ==2) func2();
else func3();
}
return 0;
}
#include <iostream>
using namespace std;
const int N=5e4+10;
const int INF=0x3f3f3f3f;
int d[2010][2010],ml[2010];
int n,m,k;
void dij()
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
}
}
}
int main()
{
cin>>n>>m>>k;
for(int i=0;i<m;i++) cin>>ml[i];
fill(d[0],d[0]+2010*2010,INF);
for(int i=0;i<n-1;i++)
{
int a,b,c;
cin>>a>>b>>c;
d[a][b]=c;
d[b][a]=c;
}
dij();
int ans=INF;
if(k==1) cout<<0;
else
{
for(int i=0;i<m-1;i++)
for(int j=i+1;j<m;j++)
ans=min(ans,d[i][j]);
cout<<ans;
}
return 0;
}