#include<bits/stdc++.h> usingnamespace std; int mon[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; boolisLeap(int y){ return (y%4==0 && y%100!=0) || y%400==0; } intmain(){ int xq = 2;//星期 int y = 1901,m = 1,d = 1; int cnt = 0; while(y != 2024 || m != 12 || d != 31){ xq++; if(xq == 8) xq = 1; d++; if(isLeap(y)) mon[2] = 29; else mon[2] = 28; if(d > mon[m]) d = 1, m++; if(m > 12) m = 1, y++; if(xq == 1 && d % 10 == 1) cnt ++; } cout<<cnt<<endl; //输出762 return0; }
5. 填空题5
题意
给出一个长度为30的数组a,找到一个整数V,使得V对这30个数异或后,平方和最小。
求最小的平方和。
思路
我们发现所有的数都不超过 ,也就是说我们可以将所有的数用14位的二进制数来表示出来。
我们直接令V等于中的每个数,然后各自求出一个答案后取最小值即可。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#include<bits/stdc++.h> usingnamespace std; int nums[] = {9226,4690,4873,1285,4624,1596,6982,590,8806,121,8399,8526,5426,64, 9655,7705,3929,3588,7397,8020,1311,5676,3469,2325,1226,8203,9524,3648,5278,8647}; intmain(){ int mx = pow(2,14); longlong ans = 0x3f3f3f3f3f3f3f3f; for(int v = 0;v<mx;v++){ longlong sum = 0; for(int i = 0;i<30;i++){ int t = v ^ nums[i]; sum += t * t; } ans = min(ans,sum); } cout<<ans<<endl; // 1070293541 return0; }
6. 停车场
题意
每15分钟收费2元,不足15分钟不收费,问总停车时间n分钟,收费多少元
思路
很容易发现 ,其中undefinedlfloor x \rfloor$ 代表x的向下取整。
代码
1 2 3 4 5 6 7 8
#include<bits/stdc++.h> usingnamespace std; intmain(){ int n; cin>>n; cout<< n / 15 * 2; return0; }
7. 数的操作
题意
有一个整数n, 每次操作让整数的非0位减少1.问多好此操作这个数会变为0
思路
每个位数互相独立,所以我们进行数位分离,然后取最大值即可
代码
1 2 3 4 5 6 7 8 9 10 11 12
#include<bits/stdc++.h> usingnamespace std; intmain(){ longlong n; cin>>n; longlong ans = 0; while(n){ ans = max(ans,n%10); n /= 10; } return0; }