A
字符串乘法加取余
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define N 1000000
int mod=11;
void solve() {
string s;
while(cin>>s){
//cin >> s;
int ans=s[s.length()-1]-'0';
if(s[s.length()-1]=='X') ans=10;
int sum=0;
int j=0;
for(int i=0;i<s.length()-1;i++){
if(s[i]!='-'){
j++;
if(s[i]!='X')
sum+=j*(s[i]-'0');
else
sum+=10*j;
}
}
// cout<<sum<<'\n';
sum%=mod;
if(sum==ans){
cout<<"Right";
}
else{
for(int i=0;i<s.length()-1;i++){
cout<<s[i];
}
if(sum!=10)
cout<<sum;
else
cout<<"X";
}
cout<<'\n';
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
//cin >> t;
while (t--) {
solve();
}
return 0;
}
B
对于每条通道,两个岛都加1,最后for循环判断谁最大即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define N 1000000
int ans[N];
void solve() {
int n;
cin>>n;
int x,y;
while(cin>>x>>y){
ans[x]++;
ans[y]++;
}
int sum=0;
int dd=0;
for(int i=1;i<=n;i++){
if(sum<ans[i]){
sum=ans[i];
dd=i;
}
}
cout<<sum;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
//cin >> t;
while (t--) {
solve();
}
return 0;
}
C
优先队列 (结构体自定义比较)(重载函数)
按照y的大小排序贪心,大于前面符合线段的尾部答案+1,不符合遍历下一个
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define N 1000000
struct node{
int x,y;
bool operator<(const node& a)const{
return a.y<y;
}
};
void solve() {
int n;
cin >> n;
priority_queue<node>q;
for(int i=1;i<=n;i++){
int l,r;
cin>>l>>r;
q.push({l,r});
}
int pre=q.top().y;
q.pop();
int ans=1;
while(q.size()>0){
auto[l,r]=q.top();
//cout<<l<<' '<<r<<'\n';
q.pop();
if(l>=pre){
pre=r;
ans++;
}
}
cout<<ans;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
//cin >> t;
while (t--) {
solve();
}
return 0;
}
D
利用容器set的二分,每个人都只会带一次帽子,nlogn通过
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define N 1000000
void solve() {
int n,m;
cin >>n>>m;
set<int>se;
for(int i=1;i<=n;i++){
se.insert(i);
}
int ans=0;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
while(1){
auto it=se.lower_bound(x);
if(*it>=x&&*it<=y){
se.erase(*it);
ans++;
}
else{
break;
}
}
cout<<n-ans<<'\n';
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
//cin >> t;
while (t--) {
solve();
}
return 0;
}
F
SPFA 算法详解( 强大图解,不会都难!)_图解spfa-CSDN博客
具体浏览器搜索spfa,跟dij不同的是,有人交dij也过了,数据不行
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define N 1000000
struct edge{int v,w;};
vector<edge> e[N];
int vis[N],cnt[N];
int h[N],d[N];
int n,m;
int inf=1e18;
void spfa(){
queue<int>q;
for(int i=1;i<=n;i++) h[i]=inf;
for(int i=1;i<=n;i++) cnt[i]=vis[i]=0;
h[1]=0,vis[1]=1;q.push(1);
while(q.size()){
int u=q.front(); q.pop();vis[u]=0;
for(auto ed : e[u]){
int v=ed.v,w=ed.w;
if(h[v]>h[u]+w){
h[v]=h[u]+w;
cnt[v]=cnt[u]+1;
if(cnt[v]>n){
printf("- 1\n");exit(0);
}
if(!vis[v])q.push(v),vis[v]=1;
}
}
}
}
void solve() {
cin >> n >> m;
for(int i=1;i<=n;i++) e[i].clear();
for(int i=0;i<m;i++){
int u,v,w;
cin>>u>>v>>w;
e[u].push_back({v,w});
e[v].push_back({u,w});
}
spfa();
cout<<h[n]<<'\n';
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
//cin >> t;
while (t--) {
solve();
}
return 0;
}