#include<bits/stdc++.h>
using namespace std;
const int N = 1e7+10;
int T,x,t,n;
int prime[N];
int vis[N];
int sg[N];
int cnt;
void get_prime(){
vis[0]=vis[1]=1;
for(int i=2;i<N;i++){
if(!vis[i])prime[++cnt]=i,sg[i]=1;
for(int j=1;j<=cnt&&prime[j]*i<=N;j++){
vis[i*prime[j]]=1;
sg[i*prime[j]]=sg[i]+sg[prime[j]];
if(i%prime[j]==0)break;
}
}
}
signed main(){
get_prime();
cin>>T;
while(T--){
cin>>n;
x=0;
while(n--){
cin>>t;
x^=sg[t];
}
if(x)puts("Alice");
else puts("Bob");
}
}
#include<bits/stdc++.h>
using namespace std;
int main(){
int T;
cin>>T;
while(T--){
int n,m;
cin>>n>>m;
if(n%(m+1)==0)puts("Rabbit");
else puts("Grass");
}
}
#include<iostream>
using namespace std;
int main(){
int n,m;
while(scanf("%d %d",&n,&m)!=EOF){
if(n%(m+1)==0)puts("none");
else{
int ok=0;
if(n>m)
for(int i=1;i<=m;i++){
if((n-i)%(m+1)==0){
if(!ok){cout<<i;ok=1;}
else cout<<" "<<i;
}
}
else for(int i=n;i<=m;i++){
if(!ok){cout<<i;ok=1;}
else cout<<" "<<i;
}
puts("");
}
}
}
刚提交的时候presentation error
说明思路没问题只是输出跟标准答案有一点点小区别
这就是空格或者多打了一行,平时遇到这种卡输出的要养成习惯
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
int n;
priority_queue<PII,vector<PII>,greater<PII>>q;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int zuo,you;
cin>>zuo>>you;
q.push({zuo,you});
}
int ans=1;
int now_left=q.top().first;
int now_right=q.top().second;
while(!q.empty()){
auto t=q.top();
q.pop();
int zuo=t.first;
int you=t.second;
if(you<=now_right)continue;
else if(zuo>now_right)ans++,now_right=you;
else if(you>now_right)now_right=you;
}
cout<<ans;
}
prim算法求最小生成树
#include <iostream>
#include <cstring>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
const int N = 505;
int g[N][N];
int dist[N];
int st[N];
int n,m;
int prim(){
int res=0;
dist[1]=0;
memset(dist,0x3f,sizeof dist);
for(int i=0;i<n;i++){
int t=-1;
for(int j=1;j<=n;j++){
if(!st[j]&&(t==-1||dist[t]>dist[j]))t=j;
}
if(i&&dist[t]==INF)return INF;
if(i)res+=dist[t];
st[t]=1;
for(int j=1;j<=n;j++)dist[j]=min(dist[j],g[j][t]);
}
return res;
}
signed main(){
memset(g,0x3f,sizeof g);
cin>>n>>m;
int a,b,c;
for(int i=1;i<=m;i++){
cin>>a>>b>>c;
g[a][b]=g[b][a]=min(g[a][b],c);
}
int ans=prim();
if(ans==INF)puts("impossible");
else cout<<ans;
}
topsort
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int h[N],e[N],ne[N],q[N],n,m;
int chudu[N];
int idx;
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
bool topsort(){
int hh=1,tt=0;
for(int i=1;i<=n;i++)if(chudu[i]==0)q[++tt]=i;
while(hh<=tt){
int t=q[hh++];
for(int i=h[t];~i;i=ne[i]){
int j=e[i];
chudu[j]--;
if(chudu[j]==0)q[++tt]=j;
}
}
return tt==n;
}
int main(){
cin>>n>>m;
memset(h,-1,sizeof h);
while(m--){
int a,b;
cin>>a>>b;
add(a,b);
chudu[b]++;
}
if(topsort()){
for(int i=1;i<=n;i++)printf("%d ",q[i]);
}
else puts("-1");
}
给出 n 个数,要求求出两个不相交的 subset,使得他们的和一样。
n, a[i] <= 1e5
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5+5;
int n,a[N],dp[2][N];
int b[N];
int vis[N];
int cnt=0;
long long sum;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",a+i);
vis[a[i]]++;
if(vis[a[i]]>=3){puts("no");return 0;}
sum+=a[i];
if(vis[a[i]]==2)sum-=a[i]*2;
}
if(sum&1){puts("no");return 0;}
sum/=2;
for(int i=1;i<=n;i++){
for(int j=1;j<=sum;j++){
if(j>=a[i])dp[i%2][j]=max(dp[i%2][j] , dp[(i-1)%2][j-a[i]]+a[i]);
else dp[i%2][j]=dp[(i-1)%2][j];
}
}
if(dp[n%2][sum]==sum)puts("yes");
else puts("no");
}
#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[55][55];
int vis[55][55];
typedef pair<int, int> PII;
vector<PII>q[2600];
int ans=0x3f3f3f3f;
int get_d(int x1,int x2,int y1,int y2){return abs(x1-x2)+abs(y1-y2);}
void dfs(int kk,int x,int y,int d){
if(kk==k+1){ans=min(ans,d);return;}
for(auto t:q[kk]){
int dx=t.first;
int dy=t.second;
//cout<<"dx="<<dx<<" dy="<<dy<<endl;
dfs(kk+1,dx,dy,d+get_d(x,y,dx,dy));
}
}
int dp[2600][2600];
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
q[a[i][j]].push_back({i,j});
}
}
if(n==1&&k==1){cout<<0;return 0;}
else if(n==1&&k>1){puts("-1");return 0;}
// for(auto t:q[1]){
// //cout<<t.first<<" "<<t.second<<endl;
// dfs(1,t.first,t.second,0);
// }
// if(ans==0x3f3f3f3f)puts("-1");
// else cout<<ans;
memset(dp,0x3f,sizeof dp);
for(int i=0;i<2600;i++)dp[1][i]=0;
for(int i=2;i<=k;i++){
for(int j=0;j<q[i].size();j++){
int x1=q[i][j].first;
int y1=q[i][j].second;
for(int c=0;c<q[i-1].size();c++){
int x2=q[i-1][c].first;
int y2=q[i-1][c].second;
dp[i][j]=min(dp[i][j] , dp[(i-1)][c]+abs(x1-x2)+abs(y1-y2));
}
}
}
for(int i=0;i<q[k].size();i++)ans=min(ans,dp[k][i]);
if(ans==0x3f3f3f3f)puts("-1");
else cout<<ans<<endl;
//for(int i=0;i<q[k].size();i++)cout<<dp[(k-1)][i]<<" ";
}
#include<bits/stdc++.h>
using namespace std;
int n,m;
char c[6][6];
bool yes[6][6],no[6][6],vis[6][6];
int ship[i];
int ans;
void dfs(int x,int y,int statu){
if(no[x][y])return;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>c[i][j];
if(c[i][j]=='O')yes[i][j]=1;
if(c[i][j]=='X')no[i][j]=1;
}
}
for(int i=1;i<=m;i++)cin>>ship[i];
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(yes[i][j]&&!vis[i][j] ){
vis[i][j]=1;
dfs(i,j,0);
}
}
}
}