HDU 2000-2099水題記錄帖
2000ASCII碼排序
第一遍自己寫了氣泡排序,第二遍呼叫algorithm中的sort(s,s+n)函式。
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 3+5
int main()
{
char s[maxn];
while (scanf("%s",s)!=EOF)
{
sort(s,s+3);
printf("%c %c %c\n", s[0], s[1], s[2]);
}
return 0;
}
2001 計算兩點間的距離
直接sqrt(兩個點平方的和就好)
#include<iostream> #include<algorithm> #define maxn 4+4 using namespace std; int main() { double s[maxn]; while (scanf("%lf%lf%lf%lf", &s[0],&s[1],&s[2],&s[3]) == 4) { double ans = (s[0] - s[2])*(s[0] - s[2]) + (s[1] - s[3])*(s[1] - s[3]); printf("%.2f", sqrt(ans)); printf("\n"); } return 0; }
2002 計算球的體積
球的體積公式是4*1.0/3*pi*r^3,注意的是先define pi,且4/3=1
#include<iostream>
#include<algorithm>
#define PI 3.1415927
using namespace std;
int main()
{
double r;
while (scanf("%lf",&r)!=EOF)
{
double ans = 4*1.0/3*PI*r*r*r;
printf("%.3f\n",ans);
}
return 0;
}
2003 求絕對值 內心mmp,紫書上還有個題WA搞不清楚,算了,先做這個吧。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
double a;
while (scanf("%lf", &a) != EOF)
{
printf("%.2f", abs(a));
printf("\n");
}
return 0;
}
2004 成績轉換
原來寫這個題目的時候是用switch判斷,現在看了一點紫書,採用的是用字串陣列來儲存"ABCED",
相對來說比前面的題有趣了一點。
#include<iostream>
#include<algorithm>
using namespace std;
char des[11] = { 'E','E','E','E','E','E','D','C','B','A','A' };
int main()
{
int a;
while (scanf("%d", &a)!=EOF)
{
if (a > 100 || a < 0)
{
printf("Score is error!\n");
}
else {
a /= 10;
printf("%c\n", des[a]);
}
}
return 0;
}
2005 第幾天?
閏年是被4整除且不被100整除,或者被400整除的年份。輸入月份天數WRONG了一次,忘記輸入!=EOF,TLE了一次。
#include<iostream>
#include<algorithm>
#define month 12+3
int mothday[month] = {31,-1,31,30,31,30,31,31,30,31,30,31};
bool is_pin(int y);
using namespace std;
int main()
{
int y, m, d;
while (scanf("%d/%d/%d", &y, &m, &d)!=EOF)
{
if (is_pin(y))
{
mothday[1] = 28;
}
else {
mothday[1] = 29;
}
//cout << y << "," << m << "," << d << endl;
int days = d;
for (int i = 0; i < m - 1; i++)
{
days += mothday[i];
}
printf("%d\n", days);
}
return 0;
}
bool is_pin(int y)
{
bool result;
if ((y % 4 == 0&& y % 100 != 0)|| y % 400 == 0)
{
result = false;
}
else
result= true;
return result;
}
2006 求奇數的乘積
先讀入每一行有幾個數,然後判斷這個數是否是奇數,如果是奇數,那麼相乘,最終輸出結果。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int T = 0;
while (scanf("%d", &T) != EOF)
{
int s = 1;
int a;
while(T--)
{
scanf("%d", &a);
if (a % 2 == 1) {
s *= a;
}
}
printf("%d\n", s);
}
return 0;
}
2007 平方和與立方和
本題的思路較為簡單,輸入是給定一段連續的整數,代表m與n的大小是不確定的,沒有比較m、n的大小導致了WA。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int m, n;
while (scanf("%d%d", &m, &n) != EOF)
{
int temp;
if (m > n)
{
temp = n;
n = m;
m = temp;
}
int x=0, y=0;
for (int i = m; i <= n; i++)
{
if (i % 2 == 0)x += i*i;
else y += i*i*i;
}
printf("%d %d\n", x, y);
}
return 0;
}
2008 數值統計
輸入時直接統計即可。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int T;
while (scanf("%d", &T) == 1 && T != 0)
{
double a;
int b=0,c=0,d=0;
while (T--)
{
scanf("%lf", &a);
if (a < 0) b++;
else if (a == 0)c++;
else d++;
}
printf("%d %d %d\n",b,c,d);
}
return 0;
}
2009 求數列的和
Hint:對整數N取平方根後是一個浮點數,不可以強制轉換成整數,需要新定義個浮點數用於計算。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n, m;
while (scanf("%d%d", &n, &m) != EOF)
{
double sum = 0;
double nn = n;
for (int i = 0; i < m; i++)
{
sum += nn;
nn = sqrt(nn);
//printf("%.2f,%.2f\n", sum,nn);
}
printf("%.2f\n", sum);
}
return 0;
}
2010 水仙花數
本題用了2種辦法做,如下,需要注意輸入輸出格式
#include<iostream>
#include<algorithm>
#define maxn 100
int sq[maxn];
using namespace std;
int main()
{
//解法一
//int m, n;
//while (scanf("%d%d",&m,&n)!=EOF)
//{
// int first=1,yes=0;
// for (int i = m,ii=i; i <= n; i++,ii=i)
// {
// int sum = 0, sumi = 0;
// int temp;
// while (ii)
// {
// temp = ii % 10;
// sumi = pow(temp, 3);
// sum += sumi;
// ii /= 10;
// // printf("%d %d %d\n",temp,ii,sum);
// }
// if (i == sum)
// {
// if (first)
// {
// printf("%d", i);
// first = 0;
// }
// else {
// printf(" %d", i);
// }
// yes = 1;
// }
// }
// if (!yes) {
// printf("no");
// }
// printf("\n");
//}
//解法二
int s, t = 0;
for (int i = 1; i <= 9; i++)
{
for (int j = 0; j <= 9; j++)
{
for (int k = 0; k <= 9; k++)
{
s = pow(i, 3) + pow(j, 3) + pow(k, 3);
if (s == i * 100 + j * 10 + k)
{
//printf("%d ", s);
sq[t++] = s;
}
}
}
//if (s > 999)break;
}
int m, n;
while (scanf("%d%d", &m, &n) != EOF)
{
int first = 1, yes = 0;
for (int i = 0; i < t; i++)
{
if (sq[i] >= m&&sq[i] <= n)
{
if (first)
{
printf("%d", sq[i]);
first = 0;
}
else {
printf(" %d", sq[i]);
}
yes = 1;
}
}
if (!yes) {
printf("no");
}
printf("\n");
}
return 0;
}
2011 多項式求和
按照題目意思解就可以了
#include<iostream>
#include<algorithm>
using namespace std;
double f(int i);
int main()
{
int m;
scanf("%d", &m);
while (m--)
{
int n;
scanf("%d", &n);
double sum=0;
int t=1;
for (int i = 1; i <= n; i++)
{
sum+=t*f(i);
t = -1*t;
//printf("%d\n", t);
}
printf("%.2f\n", sum);
}
return 0;
}
double f(int i)
{
return 1.0 / i;
}
2012 素數判定
自己取變數名字不要太隨便,容易忘記。還有就是提交的時候要把測試輸出註釋掉
#include<iostream>
#include<algorithm>
using namespace std;
bool is_su(int x);
int main()
{
int x, y;
while (scanf("%d%d", &x, &y) != EOF&&x!=0||y!=0)
{
int h=1;
int f;
for(int i = x; i <= y; i++)
{
f = pow(i, 2) + i + 41;
//printf("%d ", f);
if (!is_su(f)) {
h = 0;
break;
}
}
//printf("\n");
if (h == 0) printf("Sorry\n");
else printf("OK\n");
}
return 0;
}
bool is_su(int x)
{
int i;
if (x == 1)return false;
for ( i = 2; i < x; i++)
{
if (x%i == 0)
return false;
}
if(i ==x)
return true;
}
2013 蟠桃記
這個題反向求就可以了,+1之後再乘以2,注意迴圈次數要-1.
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
int sum=1;
n--;
while (n--)
{
sum = (sum + 1) * 2;
}
printf("%d\n", sum);
}
return 0;
}
2014 青年歌手大賽
在讀入每一個分數的時候,記錄最大值和最小值,並且求分數的和,最後再用總分減去最大值和最小值除以分數和減二
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
int nn = n;
int sum = 0;
int s;
scanf("%d", &s);
sum += s;
n--;
int max=s;
int min=s;
while (n--)
{
scanf("%d", &s);
if (s < min) min = s;
if (s > max)max = s;
sum += s;
}
printf("%.2f\n", (sum - max - min)*1.0 / (nn-2));
}
return 0;
}
2015 偶數求和
本題需要注意輸出格式,思路就是,記錄每一個位置的數,並且用sum加上和,記錄有幾個數相加,如果記錄的個數等於m,那麼輸出這個數,迴圈結束以後,判斷k是否存在且小於m,輸出。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,m;
while (scanf("%d%d", &n, &m) != EOF)
{
int k = 0;
int a = 0;
int sum = 0;
int i = 0;
int first=1;
for ( i = 0; i < n; i++)
{
a += 2;
sum += a;
k++;
if (k == m) {
if (first) {
printf("%d", sum / m);
first = !first;
}
else {
printf(" %d", sum / m);
}
k = 0;
sum = 0;
}
}
if (i == n && k<m &&k) {
if (first)
printf("%d", sum / k);
else
printf(" %d", sum / k);
}
printf("\n");
}
return 0;
}
2016 資料的交換輸出
採用最常規的方法直接寫的。
#include<iostream>
#include<algorithm>
#define maxn 100+10
int s[maxn];
using namespace std;
int main()
{
int n;
while (scanf("%d", &n)== 1&&n!=0)
{
int i = 0,nn=n;
scanf("%d", &s[i++]);
nn--;
int min = s[0];
int minx = 0;
while (nn--)
{
scanf("%d", &s[i]);
if (min > s[i])
{
min = s[i];
minx = i;
}
i++;
}
int temp = s[0];
s[0] = s[minx];
s[minx] = temp;
for (int i = 0; i < n; i++)
{
if (i == n - 1) printf("%d", s[i]);
else {
printf("%d ", s[i]);
}
}
printf("\n");
}
return 0;
}
2017 字串統計
讀入每一個字串,判斷是否為digit(0-9)的數字,如果是,則num++。不清楚被人200kb的記憶體是怎麼跑出來的,我的是1700kb
#include<iostream>
#include<algorithm>
#define maxn 1000
using namespace std;
int main()
{
int T;
scanf("%d", &T);
getchar();
char a;
int num = 0;
while (T--)
{
while (scanf("%c",&a)&&a!='\n')
{
if (isdigit(a)) num++;
}
printf("%d\n", num);
num = 0;
}
return 0;
}
2018 母牛的故事
這個題是個數學問題。
我用的方法是記錄小母牛1歲的個數、小母牛2歲的個數、小母牛3歲的個數、小母牛大於等於4歲的個數。
先寫個幾年這些母牛的個數,就可以找到規律。
方法一:統計每一年份的各個年齡段牛的數量
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
while (scanf("%d", &n) != EOF&&n!=0)
{
int cow1, cow2, cow3, cow4;//分別表示牛的年齡,只記做1,2,3,4
cow1 = cow2 = cow3 = 0;
cow4 = 1;
for (int i = 0; i < n-1; i++)
{
cow4 = cow4 + cow3;
cow3 = cow2;
cow2 = cow1;
cow1 = cow4;
//printf("%d %d %d %d\n", cow4, cow1, cow2, cow3);
}
int cow = cow1 + cow2 + cow3 + cow4;
printf("%d\n", cow);
}
return 0;
}
方法二:直接計算牛的總數
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
while (scanf("%d", &n) != EOF&&n!=0)
{
int a = 1, b = 2, c = 3,temp;
if (n > 0 && n < 4)printf("%d\n", n);
else {
for (int i = 0; i < n-3; i++)
{
temp = b;
b = c;
c = a + c;
a = temp;
}
printf("%d\n", c);
}
}
return 0;
}
方法三:表示式法和求斐波那契額數列類似,本題是F(1) = 1,F(2) =2,F(3) = 3,求F(n) = F(n-1)+F(n-3),線代有點忘記了,且數學渣渣不知道如何去推,日後若有機會寫出來,再補上。
2019 數列有序
如果那個m大於輸入的數字,則繼續迴圈;否則儲存到陣列以後跳出迴圈,來一個輸出一個。
#include<iostream>
#include<algorithm>
#define maxn 100+10
using namespace std;
int main()
{
int n, m;
int s[maxn];
while (scanf("%d%d", &n, &m) == 2)
{
getchar();
if (n == 0 && m == 0)break;
int i;
for (i = 0; i < n + 1; i++)
{
scanf("%d", &s[i]);
if (m >= s[i]) continue;
else {
s[i + 1] = s[i];
s[i] = m;
i += 2;
break;
}
}
//printf("%d", i);
for (int j = 0; j < i; j++)
{
if (j == i - 1)printf("%d", s[j]);
else printf("%d ", s[j]);
}
int a;
for (; i < n + 1; i++)
{
scanf("%d", &a);
printf(" %d", a);
}
printf("\n");
}
return 0;
}
2020 絕對值排序
使用sort函式,擺脫選擇排序和氣泡排序的低效率
#include<iostream>
#include<algorithm>
#define maxn 100+10
bool compare(int a, int b);
using namespace std;
int main()
{
int n;
int s[maxn];
while (scanf("%d", &n)==1)
{
if (n == 0)break;
for (int i = 0; i < n; i++)
{
scanf("%d",&s[i]);
}
sort(s, s + n,compare);
for (int i = 0; i < n; i++)
{
if(i!=n-1)
printf("%d ", s[i]);
else printf("%d", s[i]);
}
printf("\n");
getchar();
}
}
bool compare(int a,int b)
{
return abs(a) > abs(b);
}
2021 發工資
計算每一個老師的工資最少幾張鈔票,思路:貪心法。
採用/和%可以降低時間複雜度。
#include<iostream>
#include<algorithm>
using namespace std;
int s[6] = { 100,50,10,5,2,1 };
int solve(int n);
int main()
{
int n,a,ni;
while (scanf("%d", &n) == 1)
{
int sum = 0;
getchar();
if (n == 0)break;
while (n--)
{
scanf("%d", &a);
ni=solve(a);
sum += ni;
}
printf("%d\n",sum);
}
return 0;
}
int solve(int a)
{
int n = 0;
for (int i = 0; i < 6; i++)
{
/*while (a - s[i] >= 0)
{
a -= s[i];
n++;
if (a == 0)return n;
}*/
n += a / s[i];
a = a%s[i];
if (a == 0) return n;
}
}
2022 海選女主角
遍歷且記錄,注意全部為0的時候。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int m, n;
while (scanf("%d%d", &m, &n)!=EOF)
{
getchar();
int a;
int aMax = 0;
int mx = 1, ny = 1;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
scanf("%d", &a);
if (abs(a) > abs(aMax)) {
aMax = a;
mx = i + 1;
ny = j + 1;
}
}
getchar();
}
printf("%d %d %d\n", mx, ny, aMax);
}
return 0;
}
2023求平均成績
按照要求寫迴圈求出即可,注意輸出格式
#include<iostream>
#include<algorithm>
#define maxn 50+5
#define maxm 5+5
int s[maxn][maxm];
double ave_student[maxn];
double ave_class[maxm];
using namespace std;
int main()
{
int n,m;
int first = 1;
while (scanf("%d%d", &n, &m) != EOF)
{
int sum = 0;
getchar();
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
scanf("%d", &s[i][j]);
sum += s[i][j];
}
ave_student[i] = sum*1.0 / m;
//printf("%.2f\n", sum*1.0/n);
sum = 0;
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
sum += s[j][i];
}
ave_class[i] = sum*1.0 / n;
//printf("%.2f\n", sum*1.0 / m);
sum = 0;
}
int num = n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (s[i][j] < ave_class[j])
{
num--;
break;
}
}
// printf("%d", num);
}
for (int i = 0; i < n; i++) {
if(i!=n-1)
printf("%.2f ", ave_student[i]);
else printf("%.2f\n", ave_student[i]);
}
for (int i = 0; i < m; i++)
{
if (i != m - 1)
printf("%.2f ", ave_class[i]);
else printf("%.2f\n", ave_class[i]);
}
printf("%d\n", num);
printf("\n");
}
return 0;
}
2024 C語言合法識別符號
首先又回顧了什麼是C語言合法識別符號,即:只能由_、字母、數字組成的字串,且首位只能為_或者字母。
#include<iostream>
#include<algorithm>
int first = 1;
bool solve(char c);
using namespace std;
int main()
{
int T;
scanf("%d", &T);
getchar();
char c;
while(T--)
{
bool result =true;
while ((c = getchar())!=EOF&&c!='\n') {
if (!solve(c)) result = false;
}
if(result)
printf("yes\n");
else
printf("no\n");
first = 1;
}
return 0;
}
bool solve(char c)
{
if (first == 1)
{
first = 0;
if (c == '_'||isalpha(c))
return true;
else
return false;
}
else {
if (c == '_'||isalpha(c)||isdigit(c))return true;
else return false;
}
}
2025 查詢最大元素
記錄字母,然後輸出即可。利用c-‘A’來比較位置
#include<iostream>
#include<algorithm>
#define maxn 100+10
char s[maxn];
using namespace std;
int main()
{
while (scanf("%s", s) != EOF)
{
int len = strlen(s);
char c = 'A';
int temp_len;
for (int i = 0; i < len; i++)
{
temp_len = s[i] - 'A';
if (temp_len > c - 'A') {
c = s[i];
}
}
//printf("%c\n", c);
for (int i = 0; i < len; i++)
{
if (s[i] != c)
printf("%c", s[i]);
else
printf("%c(max)", s[i]);
}
printf("\n");
}
return 0;
}
2026 首字母變大寫
觀察規律,來解題,判斷那個字母是否為首字母
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
char c;
int yes=1;
while ((c = getchar()) != EOF)
{
if (c == '\n') {
printf("\n");
yes = 1;
continue;
}
if (isalpha(c))
{
if (yes) { printf("%c", toupper(c)); yes = 0; }
else printf("%c",c);
}else{
yes = 1;
printf("%c", c);
}
}
return 0;
}
2027統計母音
這個直接統計即可。
#include<iostream>
#include<algorithm>
#define maxn 128
int s[maxn];
char ans[5] = {'a','e','i','o','u'};
void sovle(char c);
void output();
using namespace std;
int main()
{
int n;
scanf("%d", &n);
getchar();
char c;
int first = 1;
while (n--)
{
while ((c = getchar()) != EOF&&c != '\n') {
sovle(c);
}
if (first){
output();
first = 0;
}
else {
printf("\n");
output();
}
}
return 0;
}
void sovle(char c)
{
s[c]++;
}
void output()
{
for (int i = 0; i < 5; i++)
{
printf("%c:%d\n", ans[i], s[ans[i]]);
}
s['a'] = 0;
s['e'] = 0;
s['i'] = 0;
s['o'] = 0;
s['u'] = 0;
}
2028 求最小公倍數
回顧了兩個數的最小公倍數是兩個數的乘積除以兩個數的最大公約數,且兩個數的最大公約數的演算法:輾轉相處法。
#include<iostream>
#include<algorithm>
int gcd(int a, int b);
using namespace std;
int main()
{
int n;
while (scanf("%d", &n)!=EOF)
{
int a,b,temp;
scanf("%d", &a);
n--;
while (n--)
{
scanf("%d", &b);
if (a < b) {
temp = a;
a = b;
b = temp;
}
a=a/gcd(a, b)*b;
}
printf("%d\n", a);
}
return 0;
}
int gcd(int a, int b)
{
int temp;
while (a%b != 0)
{
temp = b;
b = a%b;
a = temp;
}
return b;
}
2029 迴文串
按照要求寫即可。
#include<iostream>
#include<algorithm>
#define maxn 1000000000
char s[maxn];
using namespace std;
int main()
{
int n,len;
scanf("%d", &n);
getchar();
while (n--)
{
int yes = 1;
scanf("%s", s);
len = strlen(s);
for (int i = 0; i < len / 2; i++)
{
if (s[i] != s[len - 1- i]){
yes = 0;
break;
}
}
if (yes) printf("yes\n");
else printf("no\n");
}
return 0;
}
2030 漢字統計
回顧了漢字的編碼方式,當連續識別到兩個位元組的首位都為1,那麼這個字元是漢字。
即識別到的c<0,最後要除以2,來得到漢字的數量
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
getchar();
char c;
while (n--)
{
int num=0;
while ((c = getchar())!= EOF&&c!='\n')
{
if (c < 0) num++;
}
printf("%d\n", num/2);
}
return 0;
}
2031 進位制轉換
這個按照要求,自己寫一個例子然後照著例子編碼即可。
HINT:注意正負
#include<iostream>
#include<algorithm>
#define maxn 1000000
char des[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int ans[maxn];
void solve(int n, int m);
int i = 0;
using namespace std;
int main()
{
int n, m;
while (scanf("%d%d", &n, &m) == 2)
{
if (n == 0)printf("0\n");
solve(abs(n), m);
if (n < 0)printf("-");
while (i>0)
{
i--;
printf("%c", des[ans[i]]);
}
printf("\n");
}
return 0;
}
void solve(int n, int m)
{
while (n / m != 0)
{
ans[i++] = n%m;
n = n / m;
}
ans[i++] = n%m;
}
2032楊輝三角
想起高中數學當中總是有這個玩意,其實也很簡單,觀察規律,先算個幾十層的楊輝三角,然後輸出即可。
#include<iostream>
#include<algorithm>
#define maxn 30+5
int first = 1;
int s[maxn][maxn];
using namespace std;
void output(int n) {
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= i; j++)
{
if(j==0)
printf("%d", s[i][j]);
else printf(" %d", s[i][j]);
}
printf("\n");
}
printf("\n");
}
int main()
{
memset(s, 0, sizeof(s));
for (int i = 0; i < 30; i++)
{
for (int j = 0; j <= i; j++)
{
if (j == 0) s[i][j] = 1;
else s[i][j] = s[i - 1][j] + s[i-1][j-1];
}
}
int n;
while (scanf("%d",&n)!=EOF)
{
output(n);
}
return 0;
}
2033 人見人愛A+B
這個按照題意來寫即可。
HINT:可以直接計算出來,不用反覆用其他的變數。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
getchar();
int h, m, s, h1, m1, s1;
while (n--)
{
scanf("%d%d%d%d%d%d", &h, &m, &s, &h1, &m1, &s1);
h = ((s + s1) / 60 + m + m1) / 60 + h + h1;
m = ((s + s1) / 60 + m + m1) % 60;
s = (s + s1) % 60;
printf("%d %d %d\n", h, m, s);
getchar();
}
return 0;
}
2034 人見人愛A-B
這個題,我開始寫了好久,最後一直WA,不曉得為啥。
思路是先把陣列n記錄,然後連續輸入m個數,對陣列n進行遍歷,如果相同,則替換為一個無窮大的數字,排序後輸出。
當然也需要記錄那個無窮大的數值時候需要輸出的問題。
然後換了一個思路,多開一個數組,用於存放結果,迴圈遍歷陣列n中的數是否需要輸出。
#include<iostream>
#include<algorithm>
const int maxn = 110;
int in[maxn];
int im[maxn];
int ans[maxn];
using namespace std;
int main()
{
int n, m;
while (scanf("%d%d", &n, &m) == 2)
{
if (n == 0 && m == 0)break;
for (int i = 0; i < n; i++)
scanf("%d", &in[i]);
for (int i = 0; i < m; i++)
scanf("%d", &im[i]);
int yes = 0, t = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++)
{
if (in[i] == im[j]) yes = 1;
}
if (yes == 0) ans[t++] = in[i];
yes = 0;
}
if (t == 0) printf("NULL");
else {
sort(ans, ans + t);
for (int i = 0; i < t; i++)
{
printf("%d ", ans[i]);
}
}
printf("\n");
}
return 0;
}
PS:最近放假,然後又幾天沒有切水題啦,不過我會慢慢切完的。
2035 人見人愛A^B
這個題也很簡單,考慮了a的b次方的後3位數字的影響的情況只可能和後面的那3位有關,即把大於1000的數值都過濾掉即可。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n, m;
while (scanf("%d%d", &n, &m) == 2)
{
if (n == 0 && m == 0)break;
int t=1;
while (m--) {
t = t*n % 1000;
}
printf("%d\n", t);
}
return 0;
}
2036 改革春風吹滿地
這個題把思緒帶回了高中數學,雖然大學裡面也有線性代數課,不過早就忘記的差不多了,記得高中推過三角形的面積公式
S=|(x1*y2-x2*y1)/2|,其實也就是向量的叉積公式,上網查了一些資料,也確實是這樣做的,自己畫幾個多邊形然後分隔稱為三角形,發現每次求的三角形的面積累加的那個面積是其中一條邊都是這一次的一條邊,還有下一次輸入的點和這一次輸入的點的邊,因此需要賦值。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
while (scanf("%d", &n) == 1 && n!=0)
{
int x1, y1, x2, y2;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
int T = n - 2;
int x3, y3;
double s = 0;
while (T--)
{
scanf("%d%d", &x3, &y3);
s += ((x1 - x2)*(y1 - y3) - (x1 - x3)*(y1 - y2))*1.0/2;
x2 = x3;
y2 = y3;
}
printf("%.1f\n",abs(s));
}
return 0;
}
2037 今年暑假不AC
本題是一個經典的貪心問題,原來上演算法設計課的時候也做過,不過沒太多印象了,當時好像是用陣列且是自己寫的排序演算法。
這一次用struct作為資料結構,用sort來進行排序。
#include<cstdio>
#include<algorithm>
using namespace std;
struct node {
int start, end;
bool operator <(const node& w)const {
return end < w.end;
}
}s[105];
int main()
{
int n;
while (scanf("%d", &n) == 1)
{
if (n == 0)break;
for (int i = 0; i < n; i++)
{
scanf("%d%d", &s[i].start, &s[i].end);
}
sort(s, s + n);
/*for (int i = 0; i < n; i++) {
printf("start:%d end:%d\n ",s[i].start, s[i].end);
}*/
int k = 1;
int maxi = s[0].end;
for (int i = 1; i < n; i++)
{
if (s[i].end > s[i - 1].end) {
if (s[i].start >= maxi) {
k++;
maxi = s[i].end;
}
}
}
printf("%d\n", k);
}
return 0;
}
2038 ---
我也不知道為什麼沒有2038這個題,是不是因為不太吉祥???手動滑稽。
2039 三角形
HINT:三角形的三條邊為double型別的
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
double a, b, c;
while (n--)
{
scanf("%lf%lf%lf", &a, &b, &c);
if (a + b > c&&a + c > b&&b + c > a)
printf("YES\n");
else printf("NO\n");
}
return 0;
}
2040 親和數
HINT:2邊的都要相等
#include<cstdio>
#include<algorithm>
using namespace std;
bool sovle(int a,int b)
{
int s1 = 0;
for (int i = 1; i <= a/2; i++)
{
if (a%i == 0)s1 += i;
}
//printf("%d ", s1);
int s2 = 0;
for (int i = 1; i <= b / 2; i++)
{
if (b%i == 0)s2 += i;
}
//printf("%d", s2);
return s1 == b&& s2 == a;
}
int main()
{
int n;
scanf("%d", &n);
int a, b;
while (n--)
{
scanf("%d%d", &a, &b);
if(sovle(a, b)) printf("YES\n");
else printf("NO\n");
}
return 0;
}
2041 超級樓梯
HINT:本題採用遞迴時間會超時,所以打表即可。自己需要寫幾組資料來觀察,發現這是斐波那契數列問題。
#include<cstdio>
#include<algorithm>
#include<time.h>
using namespace std;
const int maxn = 100000000;
int s[maxn];
int solve(int x)
{
/*if (x == 1)return 1;
else if (x == 2)return 1;
else return solve(x - 1) + solve(x - 2);*/
s[1] = 1;
s[2] = 1;
if (x >= 3) {
for (int i = 3; i <= x; i++)
{
s[i] = s[i - 1] + s[i - 2];
}
}
return s[x];
}
int main()
{
int n;
scanf("%d", &n);
int x;
while (n--) {
scanf("%d", &x);
int ans=solve(x);
printf("%d\n",ans);
}
return 0;
}
2042 不容易系列之二
HINT:這個題和之前的一個題重複,沒什麼注意的。
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
while (n--)
{
int a;
scanf("%d", &a);
int sum = 3;
for (int i = 0; i < a; i++)
{
sum = (sum - 1) * 2;
}
printf("%d\n", sum);
}
return 0;
}
2043 密碼
HINT:4個標誌記得判斷的時候別寫重複了,自己就是因為這個WA了好幾次
#include<cstdio>
#include<algorithm>
#include<string>
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
while (n--)
{
string s;
cin >> s;
int len = s.length();
if (len >= 8 && len <= 16) {
int ye1 = 1, ye2 = 1, ye3 = 1, ye4 = 1;
int flag = 0;
for (int i = 0; i < len; i++) {
if (flag >= 3)break;
if (s[i] >= 'A'&&s[i] <= 'Z') {
if (ye1) {
ye1 = 0;
flag++;
}
continue;
}
else if (s[i] >= 'a'&&s[i] <= 'z') {
if (ye2) {
ye2 = 0;
flag++;
}
continue;
}
else if (s[i] >= '0'&&s[i] <= '9')
{
if (ye3) {
ye3 = 0;
flag++;
}
continue;
}
else if(s[i]=='~'||s[i]=='!'||s[i]=='@'||s[i]=='#'||s[i]=='$'||s[i]=='%'||s[i]=='^'){
if (ye4) {
ye4 = 0;
flag++;
}
}
}
printf("%s\n", (flag >= 3) ? "YES" : "NO");
}
else {
printf("NO\n");
}
}
return 0;
}
2044 一隻小蜜蜂
這個題和上樓梯的題的思路一樣,f(n)=f(n-1)+f(n-2),即當小蜜蜂提留在第n個蜂房的時候,它可能是從第n-1個蜂房過來的,也可能是從第n-2個蜂房直接飛過來的。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 55;
long long s[maxn];
long long solve(int a, int b)
{
int len = b - a;
s[1] = 1;
s[2] = 2;
if (len >= 3) {
for (int i = 3; i <= len; i++)
{
s[i] = s[i - 1] + s[i - 2];
}
}
return s[len];
}
int main()
{
int n;
cin >> n;
while (n--)
{
int a, b;
cin >> a >> b;
long long ans=solve(a, b);
printf("%lld\n", ans);
}
return 0;
}
2045 不容易系列3-RPG難題
對於本題,畫一個RPG隨便以哪個開頭的,然後觀察規律得到結果最終乘以3即可。為N時最多可能有2^n個數需要減去上一次的值。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 50 + 5;
long long s[maxn];
long long solve(int n)
{
s[1] = 1;
s[2] = 2;
long long temp = 4;
if (n >= 3) {
for (int i = 3; i <= n; i++)
{
s[i] = temp - s[i-1];
temp *= 2;
//printf("s[%d]:%d\n",i,s[i]);
}
}
return s[n]*3;
}
int main()
{
int n;
while (scanf("%d",&n)!=EOF)
{
printf("%lld\n",solve(n));
}
return 0;
}
2046 骨牌鋪方格
觀察規律本題就是斐波那契數列題,f(n)=f(n-1)+f(n-2)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 55;
long long s[maxn];
long long sovle(int n)
{
s[1] = 1;
s[2] = 2;
if (n >= 3) {
for (int i = 3; i <= n; i++)
{
s[i] = s[i - 1] + s[i - 2];
}
}
return s[n];
}
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
printf("%lld\n",sovle(n));
}
return 0;
}
2047 阿牛的EOF牛肉串
本題找規律,多畫幾組值出來就可以發現規律
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 45;
long long s[maxn];
long long solve(int n)
{
s[1] = 3;
long long a = 1, b = 2;
for (int i = 2; i <= n; i++)
{
s[i] = s[i - 1] * 3 - a;
a = b;
b = s[i] - a;
}
return s[n];
}
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
printf("%lld\n",solve(n));
}
return 0;
}
2048 神、上帝以及老天爺
這個是錯排問題,百度查的f(n)=(n-1)*(f(n-1)+f(n-2)),其中f(n-1)的那種情況我感覺特別彆扭
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 55;
long long s[maxn];
double sovle(int n)
{
s[1] = 0;
s[2] = 1;
if (n >= 3) {
for (int i = 3; i <= n; i++)
{
s[i] = (i - 1)*(s[i - 1] + s[i - 2]);
}
}
long long t = 1;
for (int i = 1; i <= n; i++)
{
t *= i;
}
return s[n] * 100 * 1.0 / t;
}
int main()
{
int n;
scanf("%d", &n);
while (n--)
{
int a;
cin >> a;
if (a > 10)a = 10;
printf("%.2f%%\n", sovle(a));
}
return 0;
}
2049 不容易系列4-考新郎
這題是組合問題加上錯排問題,組合Cmn*錯排f(m),得到結果
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 25;
long long s[maxn];
long long u[maxn];
int main()
{
int n;
cin >> n;
long long t = 1;
u[0] = 1;
s[1] = 0;
s[2] = 1;
for (int i = 1; i <= 20; i++)
{
t *= i;
u[i] = t;
if(i>=3)
s[i] = (i - 1)*(s[i - 1] + s[i - 2]);
}
while (n--)
{
int a, b;
cin >> a >> b;
long long ans = u[a] / u[b] / u[a - b] * s[b];
printf("%lld\n", ans);
}
return 0;
}
2050 折線分隔平面
本題是直線分隔平面問題,百度可以查到很多資料,最後得到公式f(n) = f(n-1)*4 + 2 - 1;
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 10000 + 10;
long long s[maxn];
int main()
{
int n;
cin >> n;
s[1] = 2;
for (int i = 2; i <= 10000; i++)
{
s[i] = s[i - 1] + 4 * (i - 1) + 1;
}
while (n--)
{
int a;
cin >> a;
cout << s[a] << endl;
}
return 0;
}
就這樣寫到2050題了,感覺水題ac的快樂沒有做UVA上的題AC快樂,但是UVA上的不會寫。。。能力不夠水題來湊,較為尷尬。