等差数列
难绷,掉坑里了QAQ
这道题首先要知道求等差数列的公式
然后,求d的时候不要掉进坑以为最小的差值就是公差 No!!!!要是最小数值刚好是公差两倍不就错了是吧,所以这个时候就要求各个值之间的最大公因数!!懂了吧,这才是本题解题的关键(骂自己
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int n;
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++ ) cin >> a[i];
sort(a + 1, a + 1 + n);
int d = a[2] - a[1];
for(int i = 3; i <= n; i ++ ) d = __gcd(d, a[i] - a[i - 1]);
if(d == 0) cout << n << endl;
else cout << (a[n] - a[1]) / d + 1<< endl;
return 0;
}
后缀表达式
md巨坑一道题,一开始贪心错了,后面推把我推吐了QAQ
推导过程:
未改良版:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[200009];
int cnt;
int main(){
int n, m;
while(cin >> n >> m){
int N = n + m + 1;
ll sum = 0;
for (int i = 0; i < N; i++) {
cin >> a[i];
if(a[i] < 0) cnt ++ ;
}
sort(a, a + N);
if (m == 0){
for (int i = 0; i < N; i++){
sum += a[i];
}
}
else if(cnt >= m){
for(int i = 0; i < N; i ++ )
sum += abs(a[i]);
}
else{
for(int i = 0; i < N; i++)
sum += abs(a[i]);
if(cnt == 0) sum -= 2 * a[0];
}
cout << sum << endl;
}
return 0;
}
改良版
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[200009];
int main(){
int n, m;
while(cin >> n >> m){
int N = n + m + 1;
ll sum = 0;
for (int i = 0; i < N; i++) cin >> a[i];
if (m == 0){
for (int i = 0; i < n + m + 1; i++){
sum += a[i];
}
}
else{
sort(a, a + N);
sum = a[N - 1] - a[0];
for (int i = 1; i < N - 1; i++)
sum += abs(a[i]);
}
cout << sum << endl;
}
return 0;
}
Amity Assessment
思维题思维题。。。。最讨厌思维题但又比较好理解。。。
#include<bits/stdc++.h>
using namespace std;
string a, b, c, d;
string s1, s2;
int main(){
cin >> a >> b >> c >> d;
for(int i = 0; i < 2; i ++ ){
if(a[i] != 'X') s1 += a[i];
}
for(int i = 1; i >= 0; i -- ){
if(b[i] != 'X') s1 += b[i];
}
s1 += s1;
for(int i = 0; i < 2; i ++ ){
if(c[i] != 'X') s2 += c[i];
}
for(int i = 1; i >= 0; i -- ){
if(d[i] != 'X') s2 += d[i];
}
if(s1.find(s2) == string :: npos) puts("NO");
else puts("YES");
return 0;
}
Limak and Reverse Radewoosh
倒在了分数取值不能是负数,应该要干脆点零分QAQ
#include<bits/stdc++.h>
using namespace std;
int n, c;
const int N = 1010;
int p[N], t[N];
int main(){
cin >> n >> c;
for(int i = 0; i < n; i ++ ) cin >> p[i];
for(int i = 0; i < n; i ++ ) cin >> t[i];
int tsum1 = 0, sum1 = 0, sum2 = 0, tsum2 = 0;
for(int i = 0; i < n; i ++ ){
tsum1 += t[i];
sum1 += max(0, p[i] - c * tsum1);
}
for(int i = n - 1; i >= 0; i -- ){
tsum2 += t[i];
sum2 += max(0, p[i] - c * tsum2);
}
if(sum1 > sum2) cout << "Limak" << endl;
if(sum1 < sum2) cout << "Radewoosh" << endl;
if(sum1 == sum2) cout << "Tie" << endl;
return 0;
}
Limak and Displayed Friends
set自动从小到大排序
* 注意find函数在set中没有找到的表达
set<int> s;
if(s.find(b[j])==s.end())//b[j]不在set<int> s中
{
s.insert(b[j]);//执行操作
}
#include<bits/stdc++.h>
using namespace std;
const int N = 150010;
int t[N], flag[N];
int n, k, q;
set<int> s;
int main(){
cin >> n >> k >> q;
for(int i = 1; i <= n; i ++ ) cin >> t[i];
while(q -- ){
int type, id;
cin >> type >> id;
if(type == 1){
s.insert(t[id]);
if(s.size() > k) s.erase(s.begin());
}
else if(type == 2){
if(s.find(t[id]) == s.end()) puts("NO");
else puts("YES");
}
}
}
看病要排队
卡住的地方:优先队列的< 、>对应的升降序是不一样的
#include <bits/stdc++.h>
using namespace std;
struct stu
{
int priority, idx;
bool operator < (const stu &b)const{
if(priority == b.priority) return idx > b.idx;
return priority < b.priority;
}
}temp;
int main()
{
int n;
priority_queue<stu> q[4];
while(scanf("%d", &n) != EOF){
int x1, x2, t = 1;
for(int i = 1; i <= 3; i ++ ){
while(q[i].size()) q[i].pop();
}
string str;
for(int i = 0; i < n; i ++ ){
cin >> str;
if(str == "IN"){
cin >> x1 >> x2;
temp.idx = t ++ ;
temp.priority = x2;
q[x1].push(temp);
}
else if(str == "OUT"){
cin >> x1;
if(q[x1].size()){
cout << q[x1].top().idx << endl;
q[x1].pop();
}
else cout << "EMPTY" << endl;
}
}
}
return 0;
}
Cupcake Bonuses
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e6 + 5;
LL base[maxn];
LL ans[maxn];
int n, num = 1;
LL s;
vector<int> vec[maxn];
void dfs(int now,LL val){
ans[now] += base[now] * val;
for(int i = 0; i < vec[now].size(); i ++ ){
dfs(vec[now][i], val);
}
}
int main(){
cin >> n >> s;
for(int i = 0; i < maxn; i ++ ) base[i] = s;
memset(ans, 0, sizeof ans);
while(n -- ){
LL val;
int op, id;
cin >> op;
if(op == 1){
cin >> id;
num ++ ;
vec[id].push_back(num);
}
else if(op == 2){
cin >> id >> val;
base[id] = val;
}
else if(op == 3){
cin >> id >> val;
dfs(id, val);
}
else if(op == 4){
cin >> id;
cout << ans[id] << endl;
}
}
return 0;
}
免费馅饼
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int dp[N][12];
int main()
{
int n;
int x,T;
while(scanf("%d",&n)==1&&n!=0)
{
memset(dp,0,sizeof(dp));
int m=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&T);
dp[T][x]++;
m = max(m, T);
}
for(int i=m-1;i>=0;i--)
for(int j=0;j<11;j++)
{
if(j==0)
dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]);
else if(j==10)
dp[i][j]+=max(dp[i+1][j-1],dp[i+1][j]);
else
dp[i][j]+=max(dp[i+1][j-1],max(dp[i+1][j],dp[i+1][j+1]));
}
printf("%d\n",dp[0][5]);
}
return 0;
}
组建足球队
#include<bits/stdc++.h>
using namespace std;
int score[201][10][10], a[201], b[201], c[20], d[20];
int main(){
while(1){
int j, k, s, n;
scanf("%d", &n);
int m1, m2, m3;
if(n == 0) break;
for(int i = 1; i <= n; i ++ ){
scanf("%d %d ", &a[i], &b[i]);
}
for(int i = 0; i <= n; i ++ ){
for(int j = 0; j <= 8; j ++ ){
for(int k = 0; k <= 8; k ++ ){
score[i][j][k] = 0;
}
}
}
score[1][1][0] = a[1];
score[1][0][1] = b[1];
for(int i = 2; i <= n; i ++ ){
for(int j = 0; j <= 8 && j <= i; j ++ ){
for(int k = 0; k <= 8 && (j + k <= i); k ++ ){
if(j + k == 0) continue;
m1 = score[i - 1][j][k];
if(j > 0) m2 = score[i - 1][j - 1][k] + a[i];
else m2 = 0;
if(k > 0) m3 = score[i - 1][j][k - 1] + b[i];
else m3 = 0;
score[i][j][k] = max(max(m1, m2), m3);
}
}
}
printf("%d\n", score[n][8][8]);
j = k = 8;
s = 0;
for(int m = n; m >= 1; m -- ){
if(s == 16) break;
if(score[m][j][k] != score[m - 1][j][k]){
s ++ ;
c[s] = m;
if(j > 0){
if(score[m][j][k] == score[m- 1][j - 1][k] + a[m]){
d[s] = 1;
j -- ;
}
else{
d[s] = 2;
k -- ;
}
}
else{
d[s] = 2;
k -- ;
}
}
}
for(int i = 16; i >= 1; i -- ){
printf("%d %d %d %d\n", c[i], a[c[i]], b[c[i]], d[i]);
}
}
}
子序列
dp[i] [j] 表示s的前i个包含t的前j个字符所需要修改的最少字符是多少
当s[i] = t[j]时,也就是字符相同时,就代表这个字符不需要进行修改,故dp[i] [j] = dp[i - 1] [j - 1]
当s[i] != t[j]时,也就是有可能得修改,修改的话就是dp[i - 1] [j - 1] + 1, 还有可能是之前就已经包含住他了, 就是dp[i - 1] [j],所以dp[i] [j] = min(dp[i - 1] [j - 1] + 1, dp[i - 1] [j])
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int N = 1010;
int dp[N][N];
string s, t;
int main(){
cin >> s >> t;
s = " " + s;
t = " " + t;
memset(dp, INF, sizeof dp);
dp[0][0] = 0;
for(int i = 1; i <= s.size(); ++i)dp[i][0] = 0;
for(int i = 1; i <= s.size(); ++i){
for(int j = 1; j <= t.size(); ++j){
if(s[i] == t[j]){
dp[i][j] = dp[i - 1][j - 1];
}
else dp[i][j] = min(dp[i - 1][j - 1] + 1, dp[i - 1][j]);
}
}
cout<<dp[s.size()][t.size()]<<endl;
return 0;
}
年号字串
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
void fun(LL n){
if(n == 0) return;
if(n % 26 != 0){
fun(n / 26);
printf("%c", n % 26 + 'A' - 1);
}
else{
fun((n - 1) / 26);
printf("Z");
}
}
int main(){
LL num;
while(scanf("%lld", &num) != EOF){
fun(num);
puts("");
}
return 0;
}