对于无穷大的定义#define INF 0x1f1f1f1f
//今日代码
2016-07-16 personal training
A. Gravity Flip
(问改变重力方向之后的按列个数,其实只是简单的排序而已)
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
int arr[1001];
int main()
{
freopen("xx.in","r",stdin);
freopen("xx.out","w",stdout);
int n;
cin >> n;
for(int i = 0; i < n; i++)
cin >> arr[i];
sort(arr,arr+n);
cout << arr[0];
for(int i = 1; i <n ; i++)
cout <<" "<< arr[i];
cout << endl;
return 0;
}
B. Domino Effect
(问按给定方向倒的多米诺骨牌最后剩下几个没倒)
(先判最左最右的多米诺骨牌剩下个数,然后判中间每两个方向之间的剩下个数,L < R则中间都剩下,否则分奇偶讨论,奇数则剩下1个,偶数没有剩下的)
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
int arr[500050];
int main()
{
freopen("xx.in","r",stdin);
freopen("xx.out","w",stdout);
int n;
cin >> n;
for(int i = 0; i < n; i++)
scanf("%d",&arr[i]);
int step = 0;
int L,R;
int l,r;
for(int i = 0; i < n-1; i++)
{
L = i,R = i;
while(arr[R]!=arr[R+1] && R < n-1) R++;
l = L+1,r = R-1;
int s = 0;
while(l<=r)
{
s++;
arr[l] = arr[L];
arr[r] = arr[R];
l++;
r--;
}
if(step<s) step = s;
}
cout << step<< endl;
cout << arr[0];
for(int i = 1; i < n; i++)
printf(" %d",arr[i]);
cout << endl;
return 0;
}
C. Unusual Product
(问一个只有0和1的n×n矩阵按题目意思运算之后的结果)
(显然数据非常大直接模拟会超时,规律得到只有矩阵迹上的数字在运算后得以保存,其余位置的数字都重复运算了两次,0×1+1×0 = 0, 1×1+1×1 = 0,总之最后都是0,所以即使op=1或2时改变的是整行整列,最终影响只要考虑对角线上的数字即可,且对角线数字一经改变,ans的值一定改变,不用再次计算迹的和,直接取反就好,否则超时。改变0、1时用异或1取反。)
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int arr[1010][1010];
int n;
int main()
{
freopen("xx.in","r",stdin);
freopen("xx.out","w",stdout);
cin >> n;
for(int i = 0; i < n; i++)
for(int j = 0; j <n; j++)
scanf("%d",&arr[i][j]);
int ans = 0;
for(int i = 0; i < n; i++)
ans ^= arr[i][i];
int t;
cin >> t;
int op;
while(t--)
{
scanf("%d",&op);
int num;
if(op == 1 || op == 2)
{
scanf("%d",&num);
ans^=1;
}
else if(op == 3)
{
printf("%d",ans);
}
}
return 0;
}
D. Toy Sum
(求满足 的一组y值)
(利用对称性,1与1000000对应,2与999999对应,依次类推。只要判一下X集合中数字的对应数字就好。当对应数字没被X选中时,Y选取该对应数字;否则Y则选取另一对没被选过的数字。这样选取后最终结果和X集合中数字个数一样。)
(注意下数据量很大,cin cout会超时)
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int num[1000010];
bool X[1000010];
int Y[1000010];
int main()
{
freopen("xx.in","r",stdin);
freopen("xx.out","w",stdout);
int n;
cin >> n;
for(int i = 0; i <n; i++)
{
scanf("%d",&num[i]);
X[num[i]] = true;
}
int i = 0;
int len = 0;
int choose = 1;
while(i < n)
{
int inde = 1000000-num[i]+1;
if(X[num[i]] == true && X[inde] == false)
Y[len++] = inde;
if(X[num[i]] == true && X[inde] == true)
{
X[inde] = false;
while(choose <= n)
{
if(!X[choose] && !X[1000000-choose+1])
{
Y[len++] = choose;
Y[len++] = 1000000-choose+1;
choose++;
break;
}
choose++;
}
}
i++;
}
cout << len << endl<< Y[0];
for(int i = 1; i < len; i++)
printf(" %d",Y[i]);
printf("\n");
return 0;
}
F. George and Sleep
(简单的计算时差)
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int main()
{
freopen("xx.in","r",stdin);
freopen("xx.out","w",stdout);
int sh,sm;
int th,tm;
string s;
cin >> s;
sscanf(s.c_str(),"%d:%d",&sh,&sm);
cin >> s;
sscanf(s.c_str(),"%d:%d",&th,&tm);
int hh = sh-th;
int mm = sm-tm;
if(mm < 0)
{
mm+=60;
hh--;
}
if(hh < 0) hh+=24;
printf("%02d:%02d\n",hh,mm);
return 0;
}
G. George and Round
(判断第二行中比第三行大的有几个)
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int arr[3030];
int arr2[3030];
int main()
{
freopen("xx.in","r",stdin);
freopen("xx.out","w",stdout);
int n,m;
cin >> n >> m;
for(int i = 0; i < n; i++)
cin >> arr[i];
for(int i = 0; i < m; i++)
cin >> arr2[i];
sort(arr,arr+n);
sort(arr2,arr2+m);
int i,j;
for(i = 0, j = 0; i < n && j < m; j++)
{
if(arr2[j] >= arr[i]) i++;
}
cout << n-i << endl;
return 0;
}