A. Three Doors
平平无奇的一个模拟水题,经常考下标的知识。
#include <bits/stdc++.h>
using namespace std;
int a[3];
int main(){
int t;
cin>>t;
while(t--){
int x;
cin>>x;
for(int i=1;i<=3;i++)
cin>>a[i];
if(a[x]==0) {printf("NO\n");}
else if(a[a[x]]==0) {printf("NO\n");}
else printf("YES\n");
}
}
B 多次询问,有条件的前后前缀和+差分,即可求得
数据范围,记得long long
#include <bits/stdc++.h> using namespace std; #define ll long long ll a[100010]; int n,m; ll d1[100010],d2[100010]; void solve(){ cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=n;i++) { d1[i]=d1[i-1]; if(a[i]<a[i-1]) d1[i]+=a[i-1]-a[i]; } for(int i=n;i>=1;i--){ d2[i]=d2[i+1]; if(a[i]<a[i+1]) d2[i]+=a[i+1]-a[i]; } while(m--){ int x,y; cin>>x>>y; if(x<y) cout<<abs(d1[y]-d1[x])<<endl; else cout<<abs(d2[x]-d2[y])<<endl; } } int main(){ int t=1; while(t--){ solve(); } return 0; }
C 括号匹配问题,尽量让左边都是左括号,右边都是右括号,找到临界值进行判断。
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
#define ll long long
char a[N];
int s[N];
void solve(){
cin>>a+1;
int len=strlen(a+1);
int tot=0,id=0;
for(int i=1;i<=len;i++){
if(a[i]=='(') tot++;
if(a[i]==')') tot--;
if(a[i]=='?') s[++id]=i;
}
if(tot==id||id==-tot){
printf("YES\n");
return;
}
int mid=(id-tot)/2;
for(int i=1;i<mid;i++) a[s[i]]='(';
for(int i=mid;i<=id;i++) a[s[i]]=')';
a[s[mid+1]]='(';
tot=0;
bool ans=0;
for(int i=1;i<=len;i++){
if(a[i]=='(')tot++;
else tot--;
if(tot<0){
ans=1;
break;
}
}
if(ans) printf("YES\n");
else printf("NO\n");
}
int main(){
int t;
scanf("%d",&t);
while(t--){
solve();
}
}
A 一道贪心而已,先输出这个数,然后每个数都会无法整除,最小为1
#include <bits/stdc++.h>
using namespace std;
void solve(){
int x;
cin>>x;
cout<<x<<" ";
for(int i=1;i<x;i++) cout<<i<<" ";
cout<<endl;
}
int main(){
int t;
cin>>t;
while(t--){
solve();
}
}
B题
建图,然后分情况考虑。首先m为偶数的时候,那么把需要的人邀请过来即可,不开心为0;
如果m为奇数,那么一定至少少一对朋友,可以少一个人,也可以少两个人,少两个人的情况直接两层遍历,少一个人的情况:如果这个人为偶数对关系,那么剩下的是奇数对关系,将这个人的值和剩下的奇数对关系的值比较即可。
#include <bits/stdc++.h>
using namespace std;
vector<long long >a[100100];
long long b[100100];
int t; int n,m; int x,y;
int main(){
cin>>t;
while(t--){
cin>>n>>m;long long ans=0;
for(int i=1;i<=n;i++) a[i].clear();
for(int i=1;i<=n;i++) {
cin>>b[i];
ans+=b[i];
}
for(int i=1;i<=m;i++){
cin>>x>>y;
a[x].push_back(y);
a[y].push_back(x);
}
if((m%2)==0) {
cout<<"0"<<endl;
}
else{
for(int i=1;i<=n;i++){
if(a[i].size()%2) ans=min(ans,b[i]);
}
for(int i=1;i<=n;i++){
for(int j=0;j<a[i].size();j++){
int u=a[i][j];
ans=min(ans,b[i]+b[u]);
}
}
cout<<ans<<'\n';
}
}
return 0;
}
从这里书写我的奇迹。