浙工大程序设计迎新赛预赛

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

        栗酱特别喜欢玩石子游戏,就是两个人玩,有n堆石子,每堆有ai个,每次一个人可以轮流选择任意一堆,取走任意多的石子(但不能不取),谁先不能取谁输。
        栗酱觉得这个游戏很有趣,知道有一天,小太阳告诉她,其实如果两个人足够聪明,游戏的结局一开始就已经注定。
        栗酱是一个冰雪聪明的女孩子,她不相信,希望你演示给她看。

输入描述:

多组数据,数据第一行T表示数据组数。
每组数据第一行一个n,k表示一共有n堆石子,接下来你试图从第k堆开始取,从第二行开始,每隔一个空格一个第i堆石子的数量ai。
n≤105,  ai≤109

输出描述:

输出“Yes”或“No”代表从该堆开始取是否可以必胜(如果足够聪明)。
示例1

输入

2
3 2
1 2 3
2 1
2 1

输出

No
Yes

说明

小太阳哥哥说,如果想赢,就试图把每堆石子数量的异或和变为0,最终便可以获得胜利,不相信自己证一下。

备注:

小数据较多,不要使用memset,可能导致TLE。
#include<iostream>
using namespace std;
int main()
{
	int T; cin >> T;
	while (T--)
	{
		int n, k;
		cin >> n >> k; int sum = 0, tt;
		for (int i = 1; i <= n; i++)
		{
			int s; cin >> s;
			if (i == k) tt = s;
			else sum = sum^s;
		}
		if (tt > sum) cout << "Yes" << endl;
		else cout << "No" << endl;
	}
	return 0;
}
  
  
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld

题目描述

栗酱有一天在网上冲浪的时候发现了一道很有意思的数据结构题。
该数据结构形如长条形。

一开始该容器为空,有以下七种操作。

1 a从前面插入元素a

2 从前面删除一个元素

3 a从后面插入一个元素

4 从后面删除一个元素

5 将整个容器头尾翻转

6 输出个数和所有元素

7 对所有元素进行从小到大排序

输入描述:

只有一组数据,第一行n≤50000,m≤200000, a≤100000 代表最大数据数目和操作次数。
接下来每一行一个操作如上描述。保证所有操作合法(不会在容器为空时删除元素)。
6、7操作共计不会超过10次。

输出描述:

当执行6操作时,第一行先输出当前的个数,然后从头到尾按顺序输出,每两个元素之间用一个空格隔开,末尾不能有空格。
示例1

输入

10 9
1 1
3 5
3 4
6
4
5
6
7
6

输出

3
1 5 4
2
5 1
2
1 5
#include<iostream>
#include<algorithm>
int a[100003],tt=1,t1,ta=50000,tb=50001;
using namespace std;
void pp1()
{
if (tt % 2 == 1)
a[ta--] = t1;
else a[tb++] = t1;
}
void pp2()
{
if (tt % 2 == 1)
ta++;
else tb--;
}
void pp3()
{
if (tt % 2 == 1)
a[tb++] = t1;
else a[ta--] = t1;
}
void pp4()
{
if (tt % 2 == 1)
tb--;
else ta++;
}
void pp5()
{
tt++;
}
void pp6()
{
cout << tb - ta - 1 << endl;
if (tt % 2 == 1)
{
for (int i = ta + 1; i < tb; i++)
{
if (i == tb - 1) cout << a[i] << endl;
else cout << a[i] << ' ';
}
}
else
{
for (int i = tb - 1; i > ta; i--)
{
if (i == ta + 1) cout << a[i] << endl;
else cout << a[i] << ' ';
}
}
}
void pp7()
{
tt = 1;
sort(a + ta-1, a + tb);
}
int main()
{
int n, k; cin >> n >> k;
for (int i = 0; i < k; i++)
{
int t; cin >> t;
if (t == 1 || t == 3) cin >> t1;
   if (t == 1) pp1();
else if (t == 2) pp2();
else if (t == 3) pp3();
else if (t == 4) pp4();
else if (t == 5) pp5();
else if (t == 6) pp6();
else pp7();
}
return 0;
}
  
  
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld

题目描述

        青蛙妈妈最近很不放心把蝌蚪宝宝送到幼儿园,但当她买菜回家时,却发现可爱的孩子小蝌蚪走丢了。         小池塘里有很多石头,青蛙家在其中标号为s的石头上。小蝌蚪会移动k分钟,每分钟会出现在任意石头旁边,甚至多次出现在一块石头旁边。但k分钟之后,蝌蚪宝宝就游不动了。         青蛙妈妈第0秒从家所在的石头出发,每分钟移动一次,可以留在原地,也可以跳跃到一块当前可跳跃到的石头上(只能在特定的石头间双向跳跃)。

输入描述:

    
    
多组数据。
第一行输入石头个数n,青蛙妈妈可以跳跃的石头对数m,蝌蚪宝宝的活动时间k,青蛙家所在的石头s。
之后输入k个数,其中第i个数代表第i分钟蝌蚪宝宝的位置,编号从i=1开始。 接下来输入m行,每行包括两个数ui,vi,表示青蛙妈妈可以在第ui个和vi个石头间双向跳跃。

输出描述:

请输出青蛙妈妈最少几分钟发现蝌蚪宝宝。
示例1

输入

3 2 2 1
2 1
1 2
1 3
5 5 3 5
3 1 4
1 2
2 3
2 4
3 4
4 5

输出

1
3

备注:

1≤n≤100000,
1≤m≤2∗n,
1≤k≤100000,
1≤s≤n,
1≤u,v≤n,
无重边,无自环,保证联通,
数据不多于10组
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<string.h>
#include<queue>
int a[100002],b[100002];
bool b2[100002];
using namespace std;
vector<int> p[100002],q[100002];
struct node
{
int S, t;
};
queue<node> P;
int main()
{
int n, m,k,s;
while (scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF)
{
memset(b2, 0, sizeof(b2));
memset(b, 10000000, sizeof(b));
for (int i = 1; i <= k; i++)
scanf("%d", &a[i]);
for (int i = 0; i < m; i++)
{
int x, y;
scanf("%d%d", &x, &y);
if (x == y) continue;
p[x].push_back(y);
q[y].push_back(x);
}
node dc; dc.S = s, dc.t =0; P.push(dc); b[s] =0; b2[s] = 1;
while (!P.empty())
{
node dt = P.front(); P.pop();
int ss = dt.S, tt = dt.t;
int len1 = p[ss].size(), len2 = q[ss].size();
for (int i = 0; i < len1; i++)
{
dc.S = p[ss][i], dc.t = tt + 1;
if (b2[dc.S] == 0)
{
b2[dc.S] = 1;
b[dc.S] = tt + 1;
P.push(dc);
}
}
for (int i = 0; i < len2; i++)
{
dc.S = q[ss][i], dc.t = tt + 1;
if (b2[dc.S] == 0)
{
b2[dc.S] = 1;
b[dc.S] = tt + 1;
P.push(dc);
}
}
}
bool bb = 0;
for (int i = 1; i <= k; i++)
{
if (b[a[i]] <= i)
{
printf("%d\n", i); bb = 1; break;
}
}
if (bb == 0) printf("%d\n", b[a[k]]);
for (int i = 0; i < m; i++)
{
p[i].clear(); q[i].clear();
}
}
return 0;
}
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld

题目描述

栗酱在酒桌上玩一个小游戏,第一个人从1开始数数,如果遇到数字中含4或者数字是4的倍数则跳过报下一个,谁数错了就要罚酒一杯。

所以栗酱想让你写个程序把所有数生成出来,这样她就可以作弊直接读了。你一定能解决的吧?

输入描述:

只有一组数据,一个数n代表从1开始数到n。(n≤100000)

输出描述:

按顺序输出所有1到n之间任何一位都不是4的数,每两个数之间用一个回车隔开。
示例1

输入

9

输出

1
2
3
5
6
7
9

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
	int n; cin >> n;
	for (int i = 1; i <= n; i++)
	{
		int t = i; if (i % 4 == 0) continue;
		bool b = 0;
		while (t)
		{
			if (t % 10 == 4)
			{
				b = 1; break;
			}
			t = t / 10;
		}
		if (b == 0) cout << i << endl;
	}
	return 0;
}
  
  
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld

题目描述

坤酱想把一块圆形的布裁成正多边形,于是请你告诉坤酱正多边形的几个顶点应在哪里?

为了方便表示,圆给出在坐标系中,正多边形的第一个顶点固定在该圆在平行于x轴正方向最远的位置上,请按顺时针顺序输出所有的顶点。

输入描述:

    
    
输入第一行给出单独一个整数T,表示数据组数接下来T行,
每行顺序给出四个整数x,y,R,N:
表示圆心为(x,y),半径为R,裁出一个正N边形。
−10 4≤x,y≤10 4
0<R≤10 3
3≤N≤50

输出描述:

对于每组数据,输出N行,从第一个顶点开始,按顺时针顺序输出所有N个顶点的坐标。
(由于坤酱工具有限,你只需保留2位小数)
示例1

输入

2
0 0 10 4
100 0 1 3

输出

10.00 0.00
0.00 -10.00
-10.00 0.00
0.00 10.00
101.00 0.00
99.50 -0.87
99.50 0.87

备注:

π可以用4 *atan(1.0)得到。
你需要避免输出-0.00。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<stack>
#include<cmath>
#include<iomanip>
int a[100003];
using namespace std;
int main()
{
int T; cin >> T;
while (T--)
{
int a, b, R, N; cin >> a >> b >> R >> N;
double n, m, th;
th = 2 * 4 * atan(1.0) / N;
for (int i = 0; i < N; i++)
{
double x = a + R*cos(th*i), y = b - R*sin(th*i);
if (x<0.000000001&&x>-0.000000001) cout << "0.00"<<' ';
else cout << setiosflags(ios::fixed) << setprecision(2) << x << ' ';
if (y<0.000000001&&y>-0.000000001) cout << "0.00" << endl;
else cout << setiosflags(ios::fixed) << setprecision(2) << y << endl;
}
}
return 0;
}
  
  
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld

题目描述

萌萌哒栗酱有n个点,第i个点有点权a i(a i为偶数),你可以在任意两点之间添加一条边,每一条边的边权为连接它的两个点的点权之和除以2。 现在她需要添加n-1条边,使任意两点相互连通,并且连通后的边权和最大。

输入描述:

    
    
第一行一个数T,表示有T组数据。
对于每组数据,第一行输入一个数n,表示点的数量,
接下来一行输入n个数,a 1,a 2,…,a n,其中a i表示第i个点的点权。
任意两个相邻数之间用空格隔开。

输出描述:

对于每一组数据,输出一个数,即最大边权和。
示例1

输入

2
5
4 2 4 4 2
10
10 2 6 4 6 8 10 8 2 10

输出

14
73

备注:

    
    
T≤10
1≤n≤10 3
1≤ai≤10 3,保证ai为偶数。
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
int T; cin >> T;
while (T--)
{
int n; cin >> n;
int a[1002];
for (int i = 0; i < n; i++)
cin >> a[i];
sort(a, a + n);
int sum = 0;
for (int i = 0; i < n - 1; i++)
sum = sum + (a[n - 1] + a[i])*1.00 / 2;
cout << sum <<endl;
}
return 0;
}
  
  
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld

题目描述

萌萌哒栗酱终于来到了迎新赛预赛,可是开考前她发现自己居然忘记了自己的登陆密码! 已知他的密码由3个各不相同的个位数字组成,且是这3个数字所能组成的最大三位数。 冰雪聪明的栗酱掰遍了她的10根脚趾都没能算出密码,离开考没几分钟了,所以希望你能帮助她得到答案。

输入描述:

第一行一个数T,表示有T组数据。
对于每组数据,
输入一行3个数字a,b,c
数字间用空格隔开。

输出描述:

对于每组数据,输出所能组成的最大三位数。
示例1

输入

2
0 2 5
2 1 3

输出

520
321

备注:

T≤100,
0≤a,b,c≤9,
数据保证a,b,c各不相同
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
int T; cin >> T;
while (T--)
{
int a[3];
cin >> a[0] >> a[1] >> a[2];
sort(a, a + 3);
for (int i = 2;i>=0; i--)
cout << a[i];
cout << endl;
}
return 0;
}
  
  
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld

题目描述

小杰组织了一场比赛,在比赛前需要安排队伍签到,但他不确定签到要花多久时间,现在他来请求你的帮助。已知签到是在一个体育馆,该体育馆布置有三个桌子以供不同队伍的队伍同时签到,一个桌子最多只能有一支队伍签到,一支队伍只需在一张桌子前完成签到即可。如果三个桌子都有队伍在签到,其它需要签到的队伍就需要在任意一个桌子前排队,等待签到。

我们假设在t=0的时刻开始接受签到,n支队伍分别在a 1,a 2,...,a n时刻到达体育馆,每支队伍完成签到均需b的时间,为使问题简单,我们忽略体育馆中移动的时间。你需要告诉小杰最早什么时刻,所有的队伍均签到完成。

输入描述:

多组读入。
输入数据的第一行是一个整数T,表示数据的组数。
每组数据的第一行是一个整数n,表示签到的队伍数。
接下来一行有n个整数ai,表示第i支队抵达体育馆的时间。
每组的最后一行是一个整数b,表示一支队伍完成签到的时间。

输出描述:

对于每组数据,输出最后一支队伍最早签到完成的时刻。
示例1

输入

2
5
1 2 4 5 7
4
7
4 4 4 2 8 9 11
5

输出

11
17

备注:

    
    
1≤n≤600
0≤ai≤10 4
1≤b≤1500
数据不超过250组
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int main()
{
     int T; cin >> T;
     while (T--)
     {
         int n; cin >> n;
         int a[601];
         for ( int i = 0; i < n; i++)
             cin >> a[i];
         sort(a, a + n);
         int t; cin >> t;
         if (n <= 3)
         {
             cout << a[n - 1] + t << endl;
             continue ;
         }
         int x = 0, y = 0, z = 0;
         for ( int i = 0; i < n; i++)
         {
             if (x <= y&&x <= z)
             {
                 if (x <= a[i]) x = a[i] + t;
                 else x = x + t;
             }
             else if (y <= x&&y <= z)
             {
                 if (y <= a[i]) y = a[i] + t;
                 else y = y + t;
             }
             else
             {
                 if (z <= a[i]) z = a[i] + t;
                 else z = z + t;
             }
         }
         int m;
         if (x >= y) m = x;
         else m = y;
         if (z > m) m = z;
         cout << m << endl;
     }
     return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值