第二屆全國大學生算法設計與編程挑戰賽(冬季賽)
只會做水題555 剩下的連題解也沒看懂QAQ
目錄
A 塔
簽到
#include<iostream>
using namespace std;
int main()
{
char c1;
int n=26; //設定塔的層數為26
for(int i=1;i<=n;i++){ //對塔每一層按照規律進行構造。
//首先進行輸出空格的操作:對於第i行,字符前面的空格個數為n-i個。
for(int j = 1;j<=n-i;j++)
cout<<" ";
for(int j=1;j<=i;j++){ //按照規律1,輸出第1~第i個大寫字母。
c1=j+'A'-1; //第j個大寫字母為'A'+j-1
cout<<c1; //輸出第j個大寫字母
}
for(int j=i-1;j>=1;j--){ //按照規律1,輸出第i-1~第1個大寫字母,注意是倒序
c1=j+'A'-1;
cout<<c1;
}
cout<<endl;//第i行輸出結束,進行換行。
}
return 0;
}
B 日記
簽到
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef long long LL;
string s;
int main() {
s = "ibti lbtlovebte lbtlibtinbtnkbtkebtezbas jebte dosadnbtna "
"ovakbtkebtemibtijaxaszxdbtddbtddbtddbtddbtddbtd";
string res;
for (int i = 0; i < s.size(); i++) {
res.push_back(s[i]);
if (s[i] == 'l' || s[i] == 'i' || s[i] == 'n' || s[i] == 'k' ||
s[i] == 'e') {
i += 3;
}
}
cout << res << endl;
return 0;
}
C 哥布林
待補...
D 質數區間
待補...
E 神仙愛采葯
貪心即可,如果背包滿了,那么遇到1就把2換掉,否則就一直往背包里放即可
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef long long LL;
#define int LL
int v, num1, num2, res, now;
string s;
signed main() {
cin >> v;
cin >> s;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '1') {
if (num1 + num2 * 2 < v) {
num1++;
now++;
} else {
if (num2) {
num2--;
num1++;
}
}
} else {
if (num1 + num2 * 2 + 2 <= v) {
num2++;
now++;
}
}
res += now;
}
cout << res << endl;
return 0;
}
F 但更愛字符串
模擬...
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int const MAXN = 2e5 + 10;
int n, m, T;
string s = "";
string s0 = "";
string t = "";
string s1 = "";
int main() {
int len = 0;
while (getline(cin, s0)) {
int f = 0;
int da = 0;
int flag = 0;
s0.push_back('\n');
for (int i = 0; i < s0.size(); i++) {
if ((s0[i] >= 'A' && s0[i] <= 'Z') ||
(s0[i] >= 'a' && s0[i] <= 'z')) {
s = s + s0[i];
if (s0[i] >= 'A' && s0[i] <= 'Z') da++;
continue;
}
if (s[0] >= 'a' && s[0] <= 'z' || da > 1 || s.size() <= 1) {
if (len <= 1) {
f = 1;
cout << s1;
if (len == 1) cout << " ";
t = "";
s1 = "";
len = 0;
} else {
f = 1;
cout << t;
cout << " (" << s1 << ") ";
t = "";
s1 = "";
len = 0;
}
cout << s;
} else {
if (s0[i] == ' ') {
if (s0[i - 1] == ',' || s0[i - 1] == '.' ||
s0[i - 1] == '!') {
cout << " ";
continue;
}
t = t + s[0];
if (len >= 1) s1 += " ";
s1 = s1 + s;
len++;
f = 0;
} else {
if (len < 1) {
f = 1;
cout << s1;
if (len == 1) cout << " ";
t = "";
s1 = "";
len = 0;
cout << s;
} else {
f = 1;
t = t + s[0];
cout << t;
if (s != "," || s != ".") s1 = s1 + " " + s;
cout << " (";
cout << s1;
cout << ")";
t = "";
s1 = "";
len = 0;
}
}
}
if (f) cout << s0[i];
if (s0[i] >='a'&&s0[i] <='z'||s0[i] >='A'&&s0[i] <='Z')
f = 1;
s = "";
da = 0;
}
}
return 0;
}
貼個標程吧,感覺標程寫的很清晰:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
vector <string> word;//存放單詞和符號
bool bigletter(char c){//判斷是不是大寫字母
if(c>='A'&&c<='Z') return true;
return false;
}
bool smallletter(char c){//判斷是不是小寫字母
if (c>='a'&&c<='z') return true;
return false;
}
bool bigletterword(string s){//判斷是不是word
if (!bigletter(s[0])) return false;
if (s.size()<=1) return false;
for (int i=1;i<s.size();i++){
if (!smallletter(s[i])) return false;
}
return true;
}
void work(){//處理每一個單詞或符號
int n=word.size();
for (int i=0;i<n;i++){
int inow=i;
if (!bigletterword(word[i]))//如果不需要縮寫則直接輸出
cout<<word[i];
if (bigletterword(word[i])) {
if (i!=n-1){//最后一位要么跟着前面的縮寫,要么就是只有一個符合的所以不用縮寫
if (word[i+1]==" "&&bigletterword(word[i+2])){
int j;
for (j=i;j<n;j++){
if ((j-i)%2==0){
if (!bigletterword(word[j])){
j--;
break;
}
else cout<<word[j][0];
}
else if (word[j]!=" ") break;
}//j停在了最后符合要求的word的最后一位的后面一位
cout<<" (";
for (int k=i;k<j-1;k+=2)
cout<<word[k]<<' ';
cout<<word[j-1]<<')';
inow=j-1;//i直接跳過縮寫的部分
}
else cout<<word[i];
}
else cout<<word[i];
}
i=inow;
}
}
int main(){
string s;
while(getline(cin,s)){
if (s.size()==0) break;//如果輸入為空就停止
string w="";//存放單詞
for (int i=0;i<s.size();i++){//循環s
if (bigletter(s[i])||smallletter(s[i])) w+=s[i];//如果是字母則直接壓到s里
if (!bigletter(s[i])&&!smallletter(s[i])){//否則把單詞壓到word了,並把符號也壓進去
word.push_back(w);
w="";
w+=s[i];
word.push_back(w);
w="";
}
}
word.push_back(w);//把最后一個單詞壓進去
work();
word.clear();//清空word
cout<<endl;
}
return 0;//完美結束
}
G 貓腥草爭奪大戰
狀壓DP,待補...
H 無限山河印的故事
倍增+字符串hash 待補...
I 奇怪的傳輸機增加了
模擬每一天的狀態即可
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef long long LL;
double n, now;
int x, y;
const double eps = 1e-8;
// 和0做比較
int sgn(double x) {
if (fabs(x) < eps) return 0; // =0
if (x < 0)
return -1; // < 0
else
return 1; // > 0
}
int main() {
cin >> n >> x >> y;
now = n;
for (int i = 1; i <= y; i++) {
now = 2.0 * now / 3.0;
if (i >= x) {
now = min(n, now + (n / 2));
x = 1e5;
}
if(sgn(now-n/32)<0){
cout << "N0!" << endl;
printf("%d %.6lf\n", i, now);
return 0;
}
}
cout << "YE5!" << endl;
printf("%.6lf\n", now);
return 0;
}
J 奇怪的小鴨子也增加了
數學題
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef long long LL;
int A, B, a, b;
int main(){
cin >> A >> B >> a >> b;
int x = (A - a) / a / 2 + 1;
int y = (B - b) / b / 2 + 1;
cout << x * y << endl;
return 0;
}
K 關於哥倆好的數字這件事
暴力枚舉數位和
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
typedef long long LL;
#define int LL
vector<int> res[N];
int get(int x) {
int res = 0;
while (x) {
res += x % 10;
x /= 10;
}
return res;
}
signed main() {
for (int i = 1; i <= 1e7; i++) {
res[get(i)].push_back(i);
}
int n;
cin >> n;
if(n==1)
cout << 1 << endl;
else if (n <= 10) {
LL ress = 0;
for (int i = 0; i < n; i++) {
ress += res[n - 1][i];
}
cout << ress << endl;
} else if (n >= 11) {
LL ress = 1e18;
for (int j = 9; j <= 20;j++){
LL tmp = 0;
for (int i = 0; i < n; i++) tmp += res[j][i];
ress = min(ress, tmp);
}
cout << ress << endl;
}
return 0;
}
L 我們仍未知道那窩蛋的名字
待補...
M 出題人說這道題是一個簽到題
簽到
#include <bits/stdc++.h>
using namespace std;
int n;
signed main() {
cin >> n;
if (n == 1)
cout << "ADPC";
else
cout << "12345";
return 0;
}