时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
空间限制: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题目描述
#include<iostream>栗酱有一天在网上冲浪的时候发现了一道很有意思的数据结构题。该数据结构形如长条形。一开始该容器为空,有以下七种操作。
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<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题目描述
#include<iostream>青蛙妈妈最近很不放心把蝌蚪宝宝送到幼儿园,但当她买菜回家时,却发现可爱的孩子小蝌蚪走丢了。 小池塘里有很多石头,青蛙家在其中标号为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<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题目描述
#include<iostream>坤酱想把一块圆形的布裁成正多边形,于是请你告诉坤酱正多边形的几个顶点应在哪里?
为了方便表示,圆给出在坐标系中,正多边形的第一个顶点固定在该圆在平行于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<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题目描述
#include<iostream>萌萌哒栗酱有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≤101≤n≤10 31≤ai≤10 3,保证ai为偶数。
#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题目描述
#include<iostream>萌萌哒栗酱终于来到了迎新赛预赛,可是开考前她发现自己居然忘记了自己的登陆密码! 已知他的密码由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<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≤6000≤ai≤10 41≤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;
}