题目链接在这
显然,闰年一定是一个偶数,而质数除了2以外都是奇数,所以,答案永远是no
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int x;
scanf("%d",&x);
puts("no");
}
signed main()
{
int T=1;
cin>>T;
for(int index=1;index<=T;index++)
{
solve();
}
return 0;
}
判断奇数和偶数即可,在二进制中,奇数最后一位必然是1,可以用位运算的性质
#include <bits/stdc++.h>
using namespace std;
int n;
int main() {
cin >>n;
n&1?cout <<"Yes":cout <<"No";
return 0;
}
考察循环语句的嵌套使用,略
#include<bits/stdc++.h>
using namespace std;
int a[20][20];
int main()
{
int t;
scanf("%d",&t);
while (t)
{
t--;
int n,m;
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
int fl=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if (a[i][j]!=a[i][m-j+1]) fl=1;
if (fl)
printf("NO ");
else
printf("YES ");
fl=0;
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
if (a[j][i]!=a[n-j+1][i]) fl=1;
if (fl)
printf("NO ");
else
printf("YES ");
fl=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if (a[i][j]!=a[n-i+1][m-j+1]) fl=1;
if (fl) printf("NO\n");
else printf("YES\n");
}
return 0;
}
在知道前缀和的情况下,第 i i i个位置的数等于(前 i i i个数的和)-(前 i − 1 i-1 i−1个数的和),根据这个结论能得到每个数。
#include <iostream>
#define ll long long
using namespace std;
const int N=1e5+9;
ll a[N];
ll b[N];
int main(){
int n;
cin >> n;
for(int i = 1;i <= n;i++)
{
cin >> b[i];
a[i]=b[i]-b[i-1];
}
ll maxn=-1e10;
int p = 1;
for(int i = 1;i <= n;i++)
{
if(maxn<a[i])
{
maxn=a[i];
p=i;
}
}
cout << maxn << endl;
cout << p << endl;
return 0;
}
探讨两个数 a [ i ] a[i] a[i]和 a [ j ] a[j] a[j]在什么情况下满足变换后总和不增加,不妨设 a [ i ] < a [ j ] a[i]<a[j] a[i]<a[j],则要满足 2 × ( a [ j ] − a [ i ] ) > = a [ i ] + a [ j ] 2×(a[j]-a[i])>=a[i]+a[j] 2×(a[j]−a[i])>=a[i]+a[j],解得, a [ j ] > = 3 × a [ i ] a[j]>=3×a[i] a[j]>=3×a[i];贪心地考虑,最长的序列应该是 1 , 3 , 27 , 81...... 1,3,27,81...... 1,3,27,81......所以问题变成了判断 3 n − 1 3^{n-1} 3n−1是否大于 1 0 9 10^9 109,当然,莽撞地计算 3 n − 1 3^{n-1} 3n−1是不可取的,我们只需要知道 n n n在哪个范围就行了,用计算器算出, n n n最大为 19 19 19
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >>t;
while(t--) {
int n;
cin >>n;
if(n>19)cout <<"NO\n";
else cout <<"YES\n";
}
return 0;
}
我们只需要知道每个字母最后变成了什么字母,就能确定最终字符串的形态。考虑一次变化
c
1
,
c
2
c_1,c_2
c1,c2,这时我们需要把当前为
c
1
c_1
c1的所有字母转化为
c
2
c_2
c2,可以开一个长度为
26
26
26的数组记录每个小写字母当前被转化为哪个字母,初始时都没有被转化,所以都是本身。所以每次变化,找到所有被转化为
c
1
c_1
c1的字母,把他们转化为
c
2
c_2
c2即可。
这样做的复杂度是
O
(
26
×
m
)
O(26×m)
O(26×m),可以通过。
#include<bits/stdc++.h>
using namespace std;
int a[30];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
char s[200010];
scanf("%s",s+1);
for (int i=0;i<26;i++) a[i]=i;
for (int i=1;i<=m;i++)
{
char x,y;
scanf("\n%c %c",&x,&y);
for (int j=0;j<26;j++) if (a[j]==x-'a') a[j]=y-'a';
}
for (int i=1;i<=n;i++) printf("%c",a[s[i]-'a']+'a');
return 0;
}
如果均值已经是1,那么输出0即可。如果均值小于1,显然可以通过添加一个非负整数使得均值为1,所以答案为1;如果均值大于1,应该填写小于1的数才能把均值拉回1,故只能填0,直接计算需要填的0的个数即可。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
int x,sum=0;
for(int i=0;i<n;i++){
scanf("%d",&x);
sum+=x;
}
if(sum==n) printf("0\n");
else if(sum<n) printf("1\n");
else printf("%d\n",sum-n);
}
return 0;
}
每一步模拟手算时分子分母的化简。令
G
C
D
(
x
,
y
)
GCD(x,y)
GCD(x,y)为两个数
x
,
y
x,y
x,y的最大公因数,
L
C
M
(
x
,
y
)
LCM(x,y)
LCM(x,y)为
x
,
y
x,y
x,y的最小公倍数。在求出
G
C
D
(
x
,
y
)
GCD(x,y)
GCD(x,y)后需要用到
G
C
D
(
x
,
y
)
∗
L
C
M
(
x
,
y
)
=
x
∗
y
GCD(x,y) * LCM(x,y)= x*y
GCD(x,y)∗LCM(x,y)=x∗y
来求出
L
C
M
(
x
,
y
)
LCM(x,y)
LCM(x,y),同时尽量避免求
G
C
D
(
x
,
y
)
GCD(x,y)
GCD(x,y)出现负数。尽管输入的分子分母绝对值大小都不超过
1
0
9
10^9
109,但在计算过程中可能出现两个数乘积很大超过int表示范围的情况,需要用long long数据类型规避这一问题。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL n,x,y,ansx,ansy,GCD,LCM,num = 0;
LL gcd( LL a,LL b )
{
if( b==0 ) return a;
else return gcd( b,a%b );
}
void solve()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x>>y;
if( i==1 )
{
ansx = x;
ansy = y;
}
else
{
GCD = gcd( ansy , y );
LCM = y * ansy / GCD;//求最小公倍数
ansx = ( ansx*(LCM/ansy) + x*(LCM/y) );
ansy = LCM;
}
GCD = gcd( ansx,ansy );//对最后答案进行化简
ansx /= GCD;
ansy /= GCD;
}
if (ansy<0) ansy=-ansy,ansx=-ansx;
if( ansy==1 ) cout<<ansx;
else cout<<ansx<<"/"<<ansy<<endl;
}
int main()
{
solve();
return 0;
}
二分天数 m i d mid mid,判断第 m i d mid mid天时能否满足条件。
#include <bits/stdc++.h>
#define ll long long
const int N=2e6+5;
int n;
ll s,L,a[N],h[N];
bool ck(ll x)
{
ll sum=0;
for(int i=1;i<=n;i++) if(1ll*a[i]*x+h[i]>=L)
{
sum+=1ll*a[i]*x+h[i];
if(sum>=s) return 1;
}
return 0;
}
signed main()
{
scanf("%d%lld%lld",&n,&s,&L);
for(int i=1;i<=n;i++) scanf("%lld",&h[i]);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
ll l=0,r=1e18,ans=0;
while(l<=r)
{
ll mid=(1ll*l+r)>>1;
if(ck(mid)) r=mid-1,ans=mid;
else l=mid+1;
}
printf("%lld\n",ans);
return 0;
}
根据题意模拟即可。
#include <bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
int a[15];
void output(int st,int len)
{
if(st==1)
{
printf(":");
}
for(int i=1;i<st;i++)
{
if(i==8)
printf("%x",a[i]);
else
printf("%x:",a[i]);
}
if(st!=9)
printf(":");
for(int i=st+len;i<=8;i++)
{
if(i==8)
printf("%x",a[i]);
else
printf("%x:",a[i]);
}
printf("\n");
}
void solve()
{
for(int i=1; i<=7; i++)
{
scanf("%x:",&a[i]);
}
scanf("%x",&a[8]);
int st=9,len=0,tmp=0;
for(int i=1; i<=8; i++)//预处理一下最长的连续0串
{
if(a[i]==0)
tmp++;
else
{
if(tmp>len)
{
st=i-tmp;
len=tmp;
}
tmp=0;
}
}
if(tmp>len)
{
st=9-tmp;
len=tmp;
tmp=0;
}
output(st,len);
}
int main()
{
int t = 1;
scanf("%d",&t);
while(t--)
{
solve();
}
return 0;
}