多组输入
每组数据第一行输入n,m(1<=n,m<=1000),n表示年轮广场上位置的个数,m表示Mathon以及他的小伙伴总人数
第二行m个数,第i个A[i](1<=A[i]<=n)表示第i个人的位置。
每组数据输出一行,表示所需要的最少时间。
5 3
1 4 5
3 2
1 3
1
1
第一组数据选择5为集合地点,第二组数据选择2为集合地点。
1 #include
2 using namespace std;
3
4 int a[1003];
5
6 int main(){
7 int n,m;
8 while(~scanf("%d%d",&n,&m)){
9 memset(a,0,sizeof(a));
10 int x;
11 for(int i=1;i<=m;i++) {
12 scanf("%d",&a[i]);
13 }
14 int Min=1e9+7,sum=0;
15 for(int i=1;i<=n;i++){
16 sum=0;
17 for(int j=1;j<=m;j++){
18 x=abs(a[j]-i);
19 sum=max(sum,min(x,n-x));
20 }
21 Min=min(Min,sum);
22 }
23 printf("%d\n",Min);
24 }
25 return 0;
26 }
多组输入
每组输入一行,有3个数字y,m,x(1000<=y<=3000,1<=m<=12,0<=x<=9),分别代表年份,月份,和他想知道哪个数字出现的次数。
每组输出一个整数,表示数字x在这个月的日期里出现了多少次。
2017 4 4
2000 1 0
33
我也不知道,2333
第一组样例中,日中有数字4的为2017-04-04,2017-04-14,2017-04-24,4月一共有30天,因为月份中有4,所以数字4一共出现了30 + 3 = 33次
1 #include
2 using namespace std;
3
4
5 int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
6 int b[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
7
8 int main(){
9 int y,m,d;
10 while(~scanf("%d%d%d",&y,&m,&d)){
11 int xx,yy;
12 int sum=0;
13 if(m==2){
14 if((y%4==0&&y%100!=0)||y%400==0){
15 xx=29;
16 }
17 else xx=28;
18 }
19 else xx=a[m];
20 for(int i=1;i<=xx;i++){
21 int x=i;
22 while(x){
23 yy=x%10;
24 if(yy==d) sum++;
25 x/=10;
26 }
27 }
28 int mm=m;
29 if(d==0) sum+=9;
30 if(d==0&&m<=9) sum+=xx;
31 while(m){
32 yy=m%10;
33 if(yy==d) sum+=xx;
34 m/=10;
35 }
36 while(y){
37 yy=y%10;
38 if(yy==d) sum+=xx;
39 y/=10;
40 }
41 printf("%d\n",sum);
42 }
43 }
多组输入
每组输入占一行,包含一串数字(1~9),长度不超过30
输出这个安卓图案解锁是否合法,如果合法输出"YES",反之输出"NO" (请参照样例输出,不要输出引号)
14569
1953
15963
15953
YES
NO
YES
NO
1 #include
2 using namespace std;
3
4 int a[10][10];
5
6 void init(){
7 a[1][3]=1;a[1][7]=1;
8 a[7][9]=1;a[3][9]=1;
9 a[1][9]=1;a[3][7]=1;
10 a[4][6]=1;a[2][8]=1;
11 }
12 int b[10];
13 int main(){
14 string s;
15
16 while(cin>>s){
17 memset(b,0,sizeof(b));
18 memset(a,0,sizeof(a));
19 init();
20 b[s[0]-'0']=1;
21 int tt=0;
22 for(int i=1;i){
23 if(b[s[i]-'0']) {
24 tt=1;break;
25 }
26 b[s[i]-'0']=1;
27 int x=s[i-1]-'0',y=s[i]-'0';
28 if(x>y) swap(x,y);
29 if(a[x][y]) {
30 tt=1;break;
31 }
32 if(x==4||y==4)
33 a[1][7]=0;
34 if(x==8||y==8)
35 a[7][9]=0;
36 if(x==6||y==6)
37 a[3][9]=0;
38 if(x==2||y==2)
39 a[1][3]=0;
40 if(x==5||y==5){
41 a[1][9]=0;
42 a[3][7]=0;
43 a[4][6]=0;
44 a[2][8]=0;
45 }
46 }
47 if(tt) printf("NO\n");
48 else printf("YES\n");
49 }
50 }
D 小M和天平
多组数据,第一行一个数N,表示石子个数。(1<=N<=100) 接下来第二行N个数,表示石子的重量。(1<=Wi<=100) 接下来第三行一个数M,表示询问个数。(1<=M<=1000) 接下来M行每行一个数k(1<=k<=1e9),表示一个询问。
对于每组数据,输出"YES"或者"NO"
2
1 4
3
2
4
5
NO
YES
YES
1 #include
2 using namespace std;
3
4 int a[103];
5 int b[10004];
6 vector<int > c;
7
8 int main(){
9 int n;
10 while(~scanf("%d",&n)){
11 int x;
12 memset(b,0,sizeof(b));
13 c.clear();
14 c.push_back(0);
15 for(int i=1;i<=n;i++){
16 scanf("%d",&x);
17 int l=c.size();
18 for(int j=0;j){
19 int xx=x+c[j];
20 if(b[xx]==0){
21 c.push_back(xx);b[xx]=1;
22 }
23 xx=abs(x-c[j]);
24 if(b[xx]==0){
25 c.push_back(xx);b[xx]=1;
26 }
27 }
28 }
29 int m;
30 scanf("%d",&m);
31 while(m--){
32 scanf("%d",&x);
33 if(x<=10000&&b[x]) printf("YES\n");
34 else printf("NO\n");
35 }
36 }
37 }
I 主持人的烦恼
多组输入
第一行两个正整数n m(n<=1e5,m<=1e9),意义见描述
第二行有n个由空格分开的正整数xi(xi<=1e9),第i个同学的颜值
每一行输出一个数,表示最多能凑出多少组。
4 3
1 3 3 2
4 2
1 4 6 2
2
1
第二组样例中,编号为1的同学(颜值是1)与编号为4的同学(颜值是2),颜值差距为1,可以组成一组
1 #include
2 using namespace std;
3
4 int a[100005];
5
6 int main(){
7 int n,m;
8 while(~scanf("%d%d",&n,&m)){
9 for(int i=1;i<=n;i++)
10 scanf("%d",&a[i]);
11 sort(a+1,a+1+n);
12 int sum=0;
13 for(int i=2;i<=n;i++){
14 if(a[i]-a[i-1];
15 }
16 printf("%d\n",sum);
17 }
18 }
J 武藏牛奶促销
多组输入
每组数据第一行包含4个正整数x y a b(1<=x,y,a,b<=100),意义见题目描述。
对于每组数据,输出一行,表示小萌老师最多能喝多少瓶完整的牛奶。如果能喝无数瓶,输出"INF"(不要输出引号)。
1 3 1 1
4 3 6 4
INF
4
对于第二组测试样例,小萌老师有6个空的瓶身和4个瓶盖,她用4个瓶身和3个瓶盖换了2瓶牛奶并喝完,此时她就有4个空的瓶身和3个瓶盖。之后她再换2瓶牛奶并喝完,此时只有2个空的瓶身和2个瓶盖,就无法继续兑换了,所以答案是4
1 #include
2 using namespace std;
3
4 int s[303][303];
5 int main(){
6 int x,y,a,b;
7 while(~scanf("%d%d%d%d",&x,&y,&a,&b)){
8 memset(s,0,sizeof(s));
9 if(x==1||y==1){
10 if(a>=1||b>=1) printf("INF\n");continue;
11 }
12 int sum=0;
13 s[a][b]=1;
14 int tt=0;
15
16 while(a>=x||b>=y){
17 while(a>=x) {
18 sum+=a/x;
19 b+=a/x;
20 a=a+a/x-(a/x)*x;
21 if(s[a][b]==1){
22 tt=1;break ;
23 }
24 s[a][b]=1;
25 }
26 while(b>=y) {
27 sum+=b/y;
28 a+=b/y;
29 b=b+b/y-(b/y)*y;
30 if(s[a][b]==1){
31 tt=1;break ;
32 }
33 s[a][b]=1;
34 }
35 if(tt) break;
36 }
37 if(!tt)
38 printf("%d\n",sum);
39 else printf("INF\n");
40 }
41 }
42 /*
43 2 2 100 100
44 */
L 选择困难症
多组输入
每组数据第一行输入k M(k<=6,1<=M<=1e8),表示有多少类物品
接下来k行,每行以Ai(1<=Ai<=100)开头,表示这类物品有多少个,接下来Ai个数,第j个为Vj(1<=Vj<=1e8),表示小L对这类物品的第j个的喜欢值是多少。
每组输出一行,表示方案数
2 5
3 1 3 4
2 2 3
2 1
2 2 2
2 2 2
3
8
1 #include
2 using namespace std;
3 typedef long long ll;
4 const int N=1e6+40000;
5
6 int a[N],b[N];
7 int c[7][200];
8
9 int main(){
10 int n,m;
11 while(~scanf("%d%d",&n,&m)){
12 for(int i=1;i<=n;i++){
13 scanf("%d",&c[i][0]);
14 for(int j=1;j<=c[i][0];j++)
15 scanf("%d",&c[i][j]);
16 }
17 int l=0;
18 for(int i=1;i<=c[1][0];i++) a[++l]=c[1][i];
19 for(int i=2;i<=n/2;i++){
20 int ll=l;
21 for(int j=1;j<=c[i][0];j++){
22 a[++l]=c[i][j];
23 for(int k=1;k<=ll;k++)
24 a[++l]=c[i][j]+a[k];
25 }
26 }
27 int r=0;
28 for(int i=1;i<=c[n/2+1][0];i++) b[++r]=c[n/2+1][i];
29 for(int i=n/2+2;i<=n;i++){
30 int rr=r;
31 for(int j=1;j<=c[i][0];j++){
32 b[++r]=c[i][j];
33 for(int k=1;k<=rr;k++)
34 b[++r]=c[i][j]+b[k];
35 }
36 }
37 //for(int i=1;i<=l;i++) cout<38 // for(int i=1;i<=r;i++) cout<
39 sort(a+1,a+1+l);
40 ll sum=upper_bound(a+1,a+1+l,m)-a;
41 if(sum>l) sum=0;
42 else sum=l-sum+1;
43 for(int i=1;i<=r;i++){
44 int xx=m-b[i];
45 int k=upper_bound(a+1,a+1+l,xx)-a;
46 if(k<=l)
47 sum+=l-k+1;
48 if(b[i]>m) sum++;
49 }
50 cout<endl; 51 }
52 }