一.RC-u1 不要浪费金币
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=1010;
int a[N];
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n,m;
cin>>n>>m;
int ans=0;
for(int i=1;i<=n;i++){//离线
cin>>a[i];
}
int sum=0;
for(int i=0;i<n;i++){
if(sum+a[i+1]>m){
sum=0;
ans++;
//cout<<i<<endl;
}
sum+=a[i+1];
//cout<<i<<sum<<endl;
}
cout<<ans<<endl;
return 0;
}
二.RC-u2 智能服药助手
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=1010;
int a[N];//记录药的需要间隔
vector<int> times[N];//每个药的服药时间
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
while(m--){
int t,k,temp;
cin>>t>>k;
for(int i=1;i<=k;i++){
cin>>temp;
if(times[temp].size()!=0&&t-times[temp].back()<a[temp])cout<<"Don't take "<<temp<<" at "<<t<<"!"<<endl;
else times[temp].push_back(t);
}
}
return 0;
}
三.RC-u3 跑团机器人
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int tou[1100];
bool isdigite(char x){
if(x>='0'&&x<='9')return true;
return false;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
string s;
cin>>s;
ll sum1=0,sum2=0;
int flag=1;//表示加法
int bigtou=0;
int smalltou=1100;
for(int i=0;i<s.size();i++){
int mx=0,mn=0;//一开始如果是个-,需要白白经过一次,如果不初始化mx,就会加入一个乱码
int t=0;//暂存数字
//求前数字或者单个数字
if(isdigite(s[i])){
while(isdigite(s[i])){
t=10*t+(s[i]-'0');
i++;
}
if(flag==1)mx=mn=t;
else mx=mn=-t;
}
if(s[i]=='d'){
int t2=0;
if(t==0)t=1;//特殊判断
i++;
while(isdigite(s[i])){
t2=10*t2+(s[i]-'0');
i++;
}
tou[t2]+=t;
bigtou=max(bigtou,t2);
smalltou=min(smalltou,t2);
//cout<<t2<<' '<<t<<endl;
if(flag==1){
mn=t;
mx=t*t2;
}
if(flag==0){
mn=-t*t2;
mx=-t;
// puts("me");
}
}
//cout<<"hei"<<mx<<' '<<mn<<" "<<flag<<endl;
sum1+=mn;
sum2+=mx;
if(s[i]=='+')flag=1;
if(s[i]=='-')flag=0;
// cout<<flag<<endl;
}
for(int i=smalltou;i<=bigtou;i++)
if(tou[i]!=0)cout<<i<<' '<<tou[i]<<endl;
cout<<sum1<<' '<<sum2<<endl;
return 0;
}
四.RC-u4 攻略分队
五.RC-u5 树与二分图
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
/*思路:首先需要知道,二分图的充分必要条件是有奇数环(树一定是二分图)
对于一个树来说,本身是一个二分图,最大的情况是每个部分都和另一部分的点有线,此时再加任何一条线都会有奇数环。
也可以说,对于一个树是二分图,本身已经分成uv两部分,这部分线必须在uv之间,而不能再uv内(正难则反)
对于顶点数为n的二分图, 假设划分的两个集合顶点数分别为m , n-m.
显然这个二分图的最大边数为m*(n-m), 即每个顶点与对面集合所有顶点都形成的边.
由此, 我们只需要得出任一集合数量, 就可以算出最大边数, 减去已有边数即为答案
*/
const int N=1e6+10;
int h[N],e[2*N],ne[2*N];//注意:邻接表注意点1:无向边2倍
int idx;
int m;
int n;
int color[N];
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u,int c){
color[u]=c;//染色
if(color[u]==1)m++;
for(int i=h[u];i!=-1;i=ne[i]) {
int j=e[i];
if(!color[j])dfs(j,3-c);//1 2染色
}
return;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
memset(h,-1,sizeof(h));//注意:邻接表注意点2,需要初始化
cin>>n;
int temp=n;
while(temp--){//注意:如果n--就成0了
int a,b;
cin>>a>>b;
add(a,b),add(b,a);
}
/*注意:
由于已知是二分图,只需要求每部分点数,只需要染色,不需要判断
染色(由于数目是联通的,所以不存在一个点染不完的情况),用一个点可以
为了普适性,我们写基本的(两个点单独连)
*/
for(int i=1;i<=n;i++){
if(!color[i])dfs(i,1);
}
cout<<(ll)m*(n-m)-(n-1)<<endl;//注意:特别是乘法,如果不转化成ll容易爆int
return 0;
}