A:送分,裸的gcd。

 1 #include<stdio.h> 
 2 #define il inline
 3 #define it register int
 4 int T,a,b,d; 
 5 il void  gcd(int a,int b){
 6     if(!b){d=a;return;}
 7     gcd(b,a%b);
 8 }
 9 il void fr(int &num){
10     num=0;char c=getchar();int p=1;
11     while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar();
12     while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
13     num*=p;
14 }   
15 int main(){
16     fr(T);
17     while(T--)
18         fr(a),fr(b),gcd(a,b),d==1?puts("Finite"):puts("Infinite");  
19     return 0;
20 }
View Code

B:送分,直接把能用的都用掉就行。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define it register int
 4 #define il inline
 5 using namespace std;
 6 const int N=100005;
 7 int T,n,a,b,c,ans;
 8 char s[N],o[N]; 
 9 il void fr(int &num){
10     num=0;char c=getchar();int p=1;
11     while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar();
12     while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
13     num*=p;
14 }   
15 int main(){
16     fr(T);
17     while(T--){
18         scanf("%d%d%d%d%s",&n,&a,&b,&c,s+1),ans=n;
19         for(it i=1;i<=n;++i){
20             if(s[i]=='S'&&a) --a,o[i]='R';
21             else if(s[i]=='R'&&b) --b,o[i]='P';
22             else if(s[i]=='P'&&c) --c,o[i]='S';
23             else o[i]='K';
24         } 
25         for(it i=1;i<=n;++i)
26             if(o[i]=='K'){
27                 if(a) o[i]='R',--a;
28                 else if(b) o[i]='P',--b;
29                 else if(c) o[i]='S',--c;
30                 --ans;
31             }
32         if(ans<((n+1)>>1)) puts("NO");
33         else{
34             puts("YES");
35             for(it i=1;i<=n;++i) putchar(o[i]);putchar('\n');
36         }
37     } 
38     return 0;
39 }
View Code

C:送分,手玩一下发现每个块的贡献是斐波那契数列。而且好像这题之前CF出过的。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define it register int
 4 #define il inline
 5 using namespace std; 
 6 const int N=1000005;
 7 const long long mod=1e9+7;
 8 char s[N];
 9 long long f[N],ans=1;
10 int n; 
11 il void fr(int &num){
12     num=0;char c=getchar();int p=1;
13     while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar();
14     while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
15     num*=p;
16 }   
17 int main(){
18     scanf("%s",s+1),n=strlen(s+1);
19     f[0]=f[1]=1,f[2]=2;for(it i=3;i<=n;++i) f[i]=(f[i-1]+f[i-2])%mod;
20     for(it i=1;i<=n;++i){
21         if(s[i]=='u'||s[i]=='n'){
22             it j;
23             for(j=i;s[j]==s[i]&&j<=n;++j);
24             ans=1ll*ans*f[j-i]%mod,i=j-1;
25         }
26         if(s[i]=='m'||s[i]=='w'){
27             putchar('0');return 0;
28         }
29     }
30     printf("%lld",ans);  
31     return 0;
32 }
View Code

D:最小生成树,预处理每一对(i,j)的连边就行。n个点连通就跳出不做。而且这题据说是USACO某道原题。。

 

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #define it register int
 4 #define il inline
 5 using namespace std;
 6 const int N=3005;
 7 long long ans;
 8 int n,o[N],o1[N],o2[N],c1,c2,fa[N],cnt,cnum;
 9 struct ky{
10     int l,r;long long num;
11     bool operator<(const ky&p)const{
12         return num<p.num;
13     }
14 }a[N*N];
15 struct str{
16     int x,y,c,k;
17 }b[N];
18 il int A(it x){
19     return x<0?-x:x;
20 }
21 il int dis(it i,it j){
22     return A(b[i].x-b[j].x)+A(b[i].y-b[j].y);
23 }
24 il int fd(it x){
25     return fa[x]==x?x:fa[x]=fd(fa[x]);
26 }
27 il void fr(int &num){
28     num=0;char c=getchar();int p=1;
29     while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar();
30     while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
31     num*=p;
32 }
33 int main(){
34     fr(n);
35     for(it i=1;i<=n;++i) fr(b[i].x),fr(b[i].y),fa[i]=i;fa[n+1]=n+1;
36     for(it i=1;i<=n;++i) fr(b[i].c);
37     for(it i=1;i<=n;++i) fr(b[i].k);
38     for(it i=1;i<=n;++i){
39         for(it j=i+1;j<=n;++j) a[++cnt]=(ky){i,j,1ll*dis(i,j)*(b[i].k+b[j].k)};
40         a[++cnt]=(ky){n+1,i,b[i].c};
41     }
42     sort(a+1,a+1+cnt);
43     for(it i=1,t1,t2;i<=cnt;++i){
44         t1=fd(a[i].l),t2=fd(a[i].r);
45         if(t1==t2) continue;
46         fa[t1]=t2,ans+=a[i].num,++cnum,a[i].l<=n?o1[++c2]=a[i].l,o2[c2]=a[i].r:o[++c1]=a[i].r;
47         if(cnum==n) break;
48     }
49     printf("%lld\n%d\n",ans,c1);
50     for(it i=1;i<=c1;++i) printf("%d ",o[i]);
51     printf("\n%d\n",c2);
52     for(it i=1;i<=c2;++i) printf("%d %d\n",o1[i],o2[i]);
53     return 0;
54 }
View Code

相关文章:

  • 2021-07-15
  • 2021-10-06
  • 2022-02-19
  • 2021-10-22
  • 2021-07-15
  • 2021-07-04
  • 2021-10-29
  • 2021-08-24
猜你喜欢
  • 2022-01-27
  • 2021-06-05
  • 2021-05-02
  • 2020-05-04
  • 2021-07-30
  • 2021-11-06
  • 2021-09-06
相关资源
相似解决方案