3798 幸运年份(暴力)
如果一个年份的各位数字中非零数字不超过 1 个,则称该年是一个幸运年。
比如,100,40000,5 都是幸运年,而12,3001,12345 则不是幸运年。
现在,给定你一个年份,请你求出当前年份距离下一个幸运年多少年?
输入格式
第一行包含整数 T,表示共有 T组测试数据。
每组数据包含一个整数 n,表示当前年份。
输出格式
每组数据输出一行,一个整数,表示距离下一个幸运年的年数。
数据范围
1≤T≤100
,
1≤n≤109
。
输入样例1:
3
4
201
4000
输出样例1:
1
99
1000
直接暴力枚举
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int n,flag=0;
cin>>n;
for(int i=1;;i*=10)
{
for(int j=1;j<10;j++)
{
if(i*j>n)
{
flag=1;
cout<<i*j-n<<endl;
break;
}
}
if(flag==1)
break;
}
}
return 0;
}
3799 送糖果(暴力)
任意门
Vladik 有a个糖果,Valera 有b个糖果。两个人回合制的互送礼物给对方。第一轮,Vladik 送给 Valera 1个糖果。第二轮,Valera 送给 Vladik 2
个糖果。第三轮,Vladik 送给 Valera 。个糖果。
以此类推,两人轮流给对方送糖果,且每轮送出的糖果数量都比上一轮多一个。当某一轮,轮到某人送糖果时,如果糖果数量不够了,则停止互送礼物。请问,是谁的糖果率先不够?
注意,每个人都只能送给对方自己事先准备的糖果。自己收到的糖果不得再送还给对方。
输入格式
第一行包含整数 T,表示共有 T组测试数据。
每组数据占一行,包含两个整数 a,b。
输出格式每组数据输出一行结果,如果 Vladik 的糖果率先不够,则输出 Vladik,否则输出 Valera。
数据范围
1≤T≤10
,
1≤a,b≤109
输入样例:
2
1 1
7 6
输出样例:
Valera
Vladik
可以二分,但是这里可以暴力过。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int a,b;
cin>>a>>b;
int k=1;
while(true)
{
if(a<k)
{
puts("Vladik");
break;
}
a-=k++;
if(b<k)
{
puts("Valera");
break;
}
b-=k++;
}
}
return 0;
}
3800 奇数还是偶数(技巧)
给定一个整数 n,它可以被表示为一个 k位的 b 进制数,如下所示:
n=a1⋅bk−1+a2⋅bk−2+…+ak−1⋅b+ak
举例说明,如果 b=17,k=3,a=[11,15,7],那么 n=11⋅172+15⋅17+7=3179+255+7=3441。
请你判断 n是奇数还是偶数。
输入格式
第一行包含整数 T,表示共有 T组测试数据。每组数据第一行包含两个整数 b 和 k。
第二行包含 k个整数 a1,a2,…,ak。
n的 b进制表示不含前导 0,也就是说只有 k=1时,a1 才有可能是 0。
输出格式
每组数据输出一行结果,n
是偶数则输出 even,奇数则输出 odd。
数据范围
1≤T≤10,2≤b≤100,1≤k≤105,0≤ai<b,
同一测试点内所有 k的和不超过 105。
输入样例:
4
13 3
3 2 7
10 9
1 2 3 4 5 6 7 8 9
99 5
32 92 85 74 4
2 2
1 0
输出样例:
even
odd
odd
even
要知道一个数的k次方对他的余数没有影响,这题就好做了
如果b是偶数,就要看最后一项,如果b是奇数,就要把所有的相加求其总和
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int b,k,sum=0,last,x,res;
cin>>b>>k;
for(int i=0;i<k;i++)
{
cin>>x;
sum+=x;
last=x;
}
res=last%2;
if(b%2)res=sum%2;
if(res)puts("odd");
else puts("even");
}
return 0;
}
3801 最佳连续子数组(简单)
任意门
给定一个长度为 n的数组 a1,a2,…,an。请你找到其中的最佳连续子数组。最佳连续子数组需满足:子数组内各元素的算术平均数(即所有元素之和除以元素个数)尽可能大。满足条件 1的前提下,子数组的长度尽可能长。输出最佳连续子数组的长度。
输入格式
第一行包含整数 T,表示共有 T组测试数据。每组数据,第一行包含整数n。
第二行包含 n个整数 a1,a2,…,an。
输出格式
每组数据输出一行结果,表示最佳连续子数组的长度。
数据范围
1≤T≤20,1≤n≤105,0≤ai≤109,同一测试点内所有 n的和不超过 105。
输入样例:
1
5
6 1 6 6 0
输出样例:
2
这个当然是找到最大值,没有事的时候肯定是自身最大,但又要尽可能的长,然后就找到有没有相同的,因为可能最大的值有多个,所以就遍历一下
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100010;
int a[N];
int main()
{
int T;
cin>>T;
while(T--)
{
int n,mx=0,res=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
mx=max(a[i],mx);
}
// cout<<mx<<endl;
for(int i=0;i<n;i++)//双指针算法
if(a[i]==mx)
{
int j=i+1;
while(j<n&&a[j]==mx)j++;
res=max(res,j-i);
i=j-1;
}
cout<<res<<endl;
}
return 0;
}
由于在双指针算法的时候忘记j<n这一个限制出现了segment fault,段错误!!while算法一定要注意范围,然后几个需要比较大小的常量,或者直接用来相加减的常量一定要赋初始值
3802 消灭数组
任意门
给定一个长度为 n 的数组,如果它不是非降序(非严格单调递增)的,那么就将它的前半部分或后半部分消灭。不断重复这个消灭一半数组的过程,直至数组变为升序为止。请问,得以幸存的数组的最大可能长度是多少?
输入格式
第一行包含整数 T,表示共有 T组测试数据。
每组数据第一行包含整数 n。
第二行包含 n 个整数 a1,a2,…,an,表示给定数组。
输出格式
输出幸存数组的最大可能长度。
数据范围
1≤T≤10,1≤n≤16,n保证是 2的整数次幂。
1≤ai≤100。
输入样例:
3
4
1 2 2 4
8
11 12 1 2 13 14 3 4
4
7 6 5 4
输出样例:
4
2
1
y总用的深搜,好简单,还有用坐标变换的,就是用cnt来记录左边的逆序个数和右边的逆序个数,然后每一次减去最小的,注意每次要变换左边,记录新的起始位置。但我觉得acwing里面的题目数据真的好小
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[100];
int dfs(int l,int r)
{
int flag=0;
for(int i=l;i<r;i++)
{
if(a[i]>a[i+1])
flag=1;
}
if(!flag)
return r-l+1;
int mid=l+r>>1;
return max(dfs(l,mid),dfs(mid+1,r));
}
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
cout<<dfs(0,n-1)<<endl;
}
return 0;
}
坐标变化
#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 110;
int a[N];
int t;
bool check( int a[], int st, int ed ) {
for ( int i = st + 1; i < ed; i++ ) {
if ( a[i] < a[i-1] ) return false;
}
return true;
}
int main( ) {
scanf("%d", &t);
while (t--)
{
int n;
scanf("%d", &n);
for ( int i = 0; i < n; i++ ) {
scanf("%d", &a[i]);
}
int res = n;
int st = 0, ed = res;
while( res ) {
if( check(a,st,ed) ) break;
int cnt1 = 0, cnt2 = 0;
int x = st, y = ed; // 存一下原来的
for ( int i = st + 1; i < ed; i++ ) {//记录
if ( i < st + res / 2 && a[i] < a[i-1] ) cnt1++;
if ( i >= st + res / 2 && a[i] < a[i-1] ) cnt2++;
}
// 坐标变换这里需要注意!!
if ( cnt1 < cnt2 ) {
st = x, ed = y / 2;
res /= 2;
}
else {
st = x + res / 2, ed = y;
res /= 2;
}
}
cout << res << endl;
}
return 0;
}