由于我不会用洛谷博客,所以就用的CSDN写的......
A,B,C三个人洗头,用同一瓶洗发水,其中共有x毫升洗发水:
求用它的最后一个洗头的人。
也就是说 ans = x mod (A+B+C);
接下来判断:
1. 当ans<=A时,输出F;
2. 当ans<=A+B时,输出M;
3. 当ans<=A+B+C时,输出T;
然后,没有然后了。
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int x,a,b,c,ans;
cin>>x>>a>>b>>c;
ans=x%(a+b+c);
if(ans<a) printf("F");
else{
if(ans<a+b) printf("M");
else printf("T");
}
return 0;
}
有两行数,判断是否存在一样的:数一样,位置一样,先输出;数一样,位置不一样,换行输出。
题意很简单,直接多来几遍枚举,判断即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
int a[1005],b[1005];
using namespace std;
int ans1,ans2;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(a[i]==b[j]){
if(i==j) ans1++;
else ans2++;
}
}
cout<<ans1<<endl<<ans2;
return 0;
}
一个平面坐标系,给几个坐标,告诉它们移动的方向(只能左右移动),考虑是否可能会有点相遇,那么相遇时:
1.两个人的纵坐标相等
2.横坐标较小的人向右走,横坐标较大的人向左走
所以可以用桶的思想,存储对于每一条水平直线上,所有向左走的最大横坐标(如果其他向左走的人能相遇,与他同向同坐标的横坐标最大的也能相遇)(2.),然后枚举向右走的中是否存在与其纵坐标相同(1.)并且向左走,然后横坐标还是大的。
#include<iostream>//cin,cout
#include<cstdio>//scanf,printf
#include<cstring>//ring类
#include<cmath>//数学库
#include<cstdlib>//freopen,system等
#include<algorithm>
#include<map>
using namespace std;
int x[2000005],y[2000005];
map<int,int> a;
string s;
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>x[i]>>y[i];
cin>>s;
for(int i=0;i<n;i++)
if(s[i]=='L'&&a[y[i]]<x[i])//左边有,并且可以向左移
a[y[i]]=x[i];
for(int i=0;i<n;i++)
if(s[i]=='R'&&a[y[i]]>x[i]){//向右移,并且右边的那个点是向左移的
cout<<"Yes";
return 0;
}
cout<<"No";
return 0;
}
一棵二叉树,第i个节点的左儿子是 i×2,右儿子是 i×2+1。给最开始所在的点,输出操作之后点所在的位置。操作有三种:
1.U
:走到当前节点的父亲
2.L
:走到当前节点的左儿子
3.R
:走到当前节点的右儿子
输出操作完的点。此时一个 L
或一个 R
可以和一个 U
抵消(也就是说/2 可以和 ∗2+1 抵消),所以只需要用一个栈来把所有可能被抵消的抵消,之后就是模拟了。(注意long long)
#include<iostream>//cin,cout
#include<cstdio>//scanf,printf
#include<cstring>//ring类
#include<cmath>//数学库
#include<cstdlib>//freopen,system等
#include<algorithm>//算法库
#include<stack>//stl栈
#include<string>//ring类
#include<map>//hash映射
#include<queue>//优先队列
#include<iomanip>//输出控制
#include<vector>//容器系列
#include<set>//不常用
#include<deque>//双向容器
#include<bitset>//二进制
using namespace std;
char s[1000005];
vector<char> a;
int main(){
long long n,x;
cin>>n>>x;
cin>>(s+1);
for(long long i=1;i<=n;i++){
if(s[i]=='U'&&!a.empty()&&a.back()!='U') a.pop_back();
else a.push_back(s[i]);
}
for(long long i=0;i<a.size();i++){
if(a[i]=='U') x=x/2;
if(a[i]=='L') x=x*2;
if(a[i]=='R') x=x*2+1;
}
cout<<x<<endl;
return 0;
}
给定一个图,尽可能地删除边,且保证任意两点之间的最短路不变。这个题范围较小,不用long long也能过。所以跑Floyd就行,Gi,j表示(i,j)之间的最短路,对于所有的i!=j!=k,删除Gi,j=Gi,k+Gk,j的边。
#include<iostream>//cin,cout
#include<cstdio>//scanf,printf
#include<cstring>//ring类
#include<cmath>//数学库
#include<cstdlib>//freopen,system等
#include<algorithm>//算法库
#include<stack>//stl栈
#include<string>//ring类
#include<map>//hash映射
#include<queue>//优先队列
#include<iomanip>//输出控制
#include<vector>//容器系列
#include<set>//不常用
#include<deque>//双向容器
#include<bitset>//二进制
using namespace std;
long long a[310][310],n,m,cnt;
long long x,y,w;
int main(){
cin>>n>>m;
for(long long i=1;i<=n;i++){
for(long long j=1;j<=n;j++)
a[i][j]=1ll*(!(i==j))<<60;
}
for(long long i=1;i<=m;i++){
cin>>x>>y>>w;
a[x][y]=min(a[x][y],w);
a[y][x]=min(a[y][x],w);
}
for(long long k=1;k<=n;k++){
for(long long i=1;i<=n;i++){
for(long long j=1;j<=n;j++){
a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
}
}
}
for(long long i=1;i<=n;i++){
for(long long j=1,tmp=1;j<=n;j++){
tmp=1;
if(i!=j){
for(long long k=1;k<=n;k++){
if(tmp){
tmp=!(i!=k&&j!=k&&a[i][j]==a[i][k]+a[k][j]);
}
}
cnt+=tmp;
}
}
}
long long ans=m-(cnt>>1);
cout<<ans;
return 0;
}