T1 Bachgold Problem
題意:
把一個數分成儘量多的指數和.
解法:
暴力.
代碼:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a;
cin>>a;
if(a%2==0)
{
cout<<a/2<<endl;
for(int i=1;i<=a/2;i++)
cout<<2<<" ";
}
else
{
cout<<a/2<<endl;
for(int i=1;i<=a/2-1;i++)
cout<<2<<" ";
cout<<3;
}
return 0;
}
小結:
**此類題目水題。**
T2 Parallelogram is Back
題意:
給你三個點的座標,找出第四個點,使其構成一個平行四邊形.
解法:
暴力直接輸出.
代碼:
using namespace std;
int x[N][2],y[N][2];
int main()
{
for(int i=1; i<=3; i++)
cin>>x[i][1]>>x[i][2];
cout<<3<<endl;
cout<<x[1][1]-x[2][1]+x[3][1]<<" "<<x[1][2]-x[2][2]+x[3][2]<<endl;
cout<<x[2][1]-x[3][1]+x[1][1]<<" "<<x[2][2]-x[3][2]+x[1][2]<<endl;
cout<<x[3][1]-x[1][1]+x[2][1]<<" "<<x[3][2]-x[1][2]+x[2][2]<<endl;
return 0;
}
小結:
**此類題目特水。**
T3 Voting
題意:
輸入一串字符串,由R和D構成.每個字符代表兩方中的一員,每個人輪流發言,可以讓另一方的人禁言.問最後留下來的一方輸出.
解法:
巧用隊列.
代碼:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 300001;
int c[N];
int main()
{
int n,k;
cin >>n>>k;
for(int i=1; i<=n; i++)
{
cin>>c[i];
}
priority_queue < pair<int,int> > q;
ll sum=0;
for(int i=1; i<=n+k; i++)
{
if(i<=n)
{
q.push(make_pair(c[i],i));
}
if(i>k)
{
ll nn = q.top().first;
ll mm = q.top().second;
q.pop();
sum+= (ll)nn * (ll)(i-mm);
c[mm]=i;
}
}
cout << sum << '\n';
for(int i=1; i<=n; i++)
{
cout << c[i] << ' ';
}
cout << '\n';
}
小結:
**此類題目充分利用隊列的原理。**
T4 Secrets
題意:
把一個數分成儘量少的3的冪次方的和,並且差最小.
解法:
暴力.
代碼:
#include<bits/stdc++.h>
using namespace std;
#define N 200000
int main()
{
long long a,b=3,c=1,d=0;
cin>>a;
if(a%3!=0)
d=a/3+1;
else
{
c=3*3;
while(a!=0)
{
if(c==a)
{
d=1;
break;
}
if(a%c!=0)
{
d=a/c+1;
break;
}
else
c*=3;
}
}
cout<<d;
return 0;
}
小結:
**此類題目可以先手算找規律。**
T5 Chips
題意:
在一個n*n的方格的變上有很多點(不在角上),方格上有很多點不能走,每個點要到對面,問有幾個可以做到.
解法:
暴力模擬.
代碼:
#include<bits/stdc++.h>
using namespace std;
#define N 1003
int y[N][N];
int main()
{
int a,b,c1,c2,d=0,r1=0,r2=0;
cin>>a>>b;
for(int i=1; i<=b; i++)
{
cin>>c1>>c2;
y[c1][c2]=1;
if(c1>1&&c1<a)
y[1][c2]=1;
if(c2>1&&c2<a)
y[c1][1]=1;
}
for(int i=2; i<a; i++)
{
if(!y[1][i]&&!y[a][i])
{
d++;
if(i==a/2+1)
r1=1;
}
if(!y[i][1]&&!y[i][a])
{
d++;
if(i==a/2+1)
r2=1;
}
}
if(a%2!=0&&r1==1&&r2==1)
d--;
cout<<d;
return 0;
}
小結:
**此類題目可以先手算找規律。**