前言
和神仙队友们解题就是很快乐!虽然没写很多题,但是效率很高!
A. Special Permutation
A题原题戳这里
题目的大致意思:输出从1到n的一个排列(只要不是自然数排列直接输出就可以了)(水题~太急躁wa了一次( ~ - ~))
题解:
#include<iostream>
using namespace std;
int main()
{
int t, n;
cin >> t;
while (t--)
{
cin >> n;
cout<< n ;
for (int i = 2; i <= n; ++i)
cout << " " << i ;
cout << endl;
}
return 0;
}
B. Unique Bid Auction
B题原题戳这里
题目的大致意思:找到数组中不重复的最小的数字并输出其索引(从1开始)(水题~)
解题思路:用一个数组储存原数组,另一个数组进行升序排序,找到最小与两端相邻的元素都不相同的数据就是需要找的数,找不到就输出-1。 题解:
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int main(){
int t;
cin >> t;
while(t--){
ll n;
cin>>n;
int a[n+1],b[n+1],min=-1;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+1+n);
if(b[1]!=b[2])min=b[1];
else{
int i;
for(i=2;i<n;i++){
if(b[i-1]!=b[i]&&b[i+1]!=b[i]){
min=b[i];
break;
}
}
if(b[n]!=b[n-1]&&i==n)min=b[i];
}
if(min==-1)cout<<min<<endl;
else{
for(int j=1;j<=n;j++){
if(a[j]==min){
cout<<j<<endl;
break;
}
}
}
}
return 0;
}
C. Sequence Transformation
C题原题戳这里
题目的大致意思:进行最少的操作次数,每次删掉两个相同数字之间的所有元素(中间不能包括相同的数字),使得最后留下来的的数字都相等。
解题思路:先将头尾连续的元素去掉,再利用map找到利用相同元素将数组划分为最小个数的小段+1就是答案(大佬队友思路~) 题解:
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
int a[200001];
int flag ;
int main()
{
int t, n;
cin >> t;
while (t--)
{
cin >> n;
map<int, int> b;
flag = 200001;
for (int i = 0; i < n; ++i)
{
cin >> a[i];
if (i == 0)
continue;
else if (a[i] != a[i - 1])
b[a[i]]++;
}
b[a[n - 1]]--;
for (int i = 0; i < n; ++i)
{
flag = min(b[a[i]], flag);
}
cout << flag + 1 << endl;
}
return 0;
}
D. Number into Sequence
D题原题戳这里
题目的大致意思:将一个数字n分成一个数组,这个数组的元素满足一下四个条件: 1.所有元素大于1 2.所有元素的累积为n 3.后面的元素可以被前一个元素整除 4.要求整个数组元素最多
解题思路:找到数字n的所有质因子,将n用质因子一直除,直到不能再除。找到能除次数最多的质因子,然后输出除的次数减1次质因子,最后输出操作后的得数。 1.为什么是质因子?如果只是因子,不是质数,那么还可以将因子分解为两个因子,就证明这个数组不是元素最多的数组。 2.为什么要一直除?因为相邻两个元素要求整除,那么相隔最小只能使商为1,即两个元素相等。 3.为什么是操作数减1?因为数组最后一个数必须能整除前一个数。 题解:
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=2e5+10;
int Max,ans,I;
void solve(ll n){
Max=0,ans=0,I=0;
for(ll i=2;i*i<=n;i++){
if(n%i==0){
while(n%i==0){
ans++;
n/=i;
}
}
if(ans>Max){
Max=ans;
I=i;
}
ans=0;
}
}
int main(){
int t;
cin >> t;
while(t--){
ll n;
cin>>n;
solve(n);
if(Max==0){
cout<<"1"<<endl<<n<<endl;
continue;
}
cout<<Max<<endl;
for(int i=0;i<Max-1;i++){
cout<<I<<" ";
n/=I;
}
cout<<n<<endl;
}
return 0;
}
总结
写题真快乐!还有两题2000分以后再补…
|