A
签到题,考虑到数据范围很小直接枚举1,2,3分别取多少个就做完了
1 #define IO std::ios::sync_with_stdio(false); 2 #define bug(x) cout<3 #include 4 #define itor ::iterator 5 using namespace std; 6 #define pb push_back 7 typedef long long ll; 8 typedef double db; 9 const int N=1e6+10; 10 int T,n,m,kase; 11 int a[10],vis[100]; 12 int main(){ 13 scanf("%d",&T); 14 while(T--){ 15 scanf("%d%d",&kase,&n); 16 for(int i=1;i<=3;i++)a[i]=0; 17 for(int i=1;i<=10;i++){ 18 int x; 19 scanf("%d",&x); 20 a[x]++; 21 } 22 int flag=0; 23 for(int i=0;i<=a[1];i++){ 24 for(int j=0;j<=a[2];j++){ 25 for(int k=0;k<=a[3];k++){ 26 int res=i+j*2+k*3; 27 if(res==n){ 28 flag=1; 29 break; 30 } 31 } 32 } 33 } 34 printf("%d ",kase); 35 if(flag)printf("YES\n"); 36 else printf("NO\n"); 37 } 38 }
B
首先对于这种很有可能是找规律的题,我们可以不去想dp啊
遇事不对先打表!
1 #define IO std::ios::sync_with_stdio(false); 2 #define bug(x) cout<3 #include 4 #define itor ::iterator 5 using namespace std; 6 #define pb push_back 7 typedef long long ll; 8 typedef double db; 9 const int N=1e6+10; 10 int vis[100][2],k; 11 int ans=0; 12 int check(int x,int y){ 13 if(x<1||y<1||y>2)return 0; 14 return 1; 15 } 16 int dx[10]={0,0,1,-1}; 17 int dy[10]={1,-1,0,0}; 18 void dfs(int x,int y,int h){ 19 if(h==k){ 20 ans++; 21 return; 22 } 23 for(int i=0;i<4;i++){ 24 int x1=x+dx[i]; 25 int y1=y+dy[i]; 26 if(check(x1,y1)&&!vis[x1][y1]){ 27 vis[x1][y1]=1; 28 dfs(x1,y1,h+1); 29 vis[x1][y1]=0; 30 } 31 } 32 } 33 int main(){ 34 for(int i=1;i<=20;i++){ 35 memset(vis,0,sizeof(vis)); 36 ans=0; 37 k=i; 38 vis[1][1]=1; 39 dfs(1,1,0); 40 printf("i=%d: %d\n",i,ans); 41 } 42 }
dfs打表发现答案跟是前两项之和然后和奇偶性也有关,
然后这个题就很水了。。。
#define IO std::ios::sync_with_stdio(false); #define bug(x) cout<#include #define itor ::iterator using namespace std; #define pb push_back typedef long long ll; typedef double db; const int N=1e6+10; int T,k,n,mod=1e4+7; int a[10005]; void init(){ a[1]=2,a[2]=3; for(int i=3;i<=1000;i++){ if(i%2){ a[i]=(a[i-1]+a[i-2]+1)%mod; } else a[i]=(a[i-1]+a[i-2])%mod; } } int main(){ init(); scanf("%d",&T); while(T--){ scanf("%d%d",&k,&n); printf("%d %d\n",k,a[n]); } }
E
有点恶心的题。。竟然没A出来
显然我们可以枚举正确时间,然后再拿时钟时间和误差时间去配对
配对我们可以排序然后一直扫一遍,注意输入输出的各种细节即可
#define IO std::ios::sync_with_stdio(false); #define bug(x) cout<#include #define itor ::iterator using namespace std; #define pb push_back typedef long long ll; typedef double db; const int N=1e3+10; int T,n,m,kase; int mod=720; int a[20],b[20],vis[20],d[20]; char s[100]; int main(){ scanf("%d",&T); while(T--){ scanf("%d%d",&kase,&n); for(int i=1;i<=n;i++){ int x,y; scanf("%d:%d",&x,&y); x%=12; x=x*60+y; a[i]=x; } for(int i=1;i<=n;i++){ scanf("%s",s); int len=strlen(s); int k=0; if(s[0]=='+')k++; int x=0,y=0,id; for(int j=1;;j++){ if(s[j]==':'){ id=j; break; } x=x*10+s[j]-48; } x%=12; for(int j=id+1;j ){ y=y*10+s[j]-48; } x=x*60+y; if(k){ b[i]=x; } else b[i]=-x; } int ans=0,t; sort(a+1,a+1+n); for(int i=0;i<=719;i++){ for(int j=1;j<=n;j++){ d[j]=(i+b[j]+mod)%mod; } sort(d+1,d+1+n); int flag=0; for(int j=1;j<=n;j++){ if(d[j]!=a[j]){ flag=1; break; } } if(!flag){ ans++; t=i; } } printf("%d ",kase); if(ans>1)printf("%d\n",ans); else if(ans==0)printf("none\n"); else{ int x=t/60,y=t%60; if(x==0)printf("12:%02d\n",y); else printf("%d:%02d\n",x,y); } } }
G
这题不会写,看网友大佬题解看懂的
传送门:https://www.cnblogs.com/artoriax/p/10576496.html